चूंकि सरणियाँ नेस्टेड हैं, इसलिए आप मूल प्रक्षेपण का उपयोग नहीं कर सकते जैसा कि आप खोज के साथ कर सकते हैं। साथ ही किसी दस्तावेज़ से सरणी सामग्री को "फ़िल्टर" करने के लिए आपको पहले सरणी सामग्री को "खोलना" चाहिए। इसके लिए आप एग्रीगेशन फ्रेमवर्क का उपयोग करें:
$results = $db->genealogical_data->aggregate(array(
array( '$match' => array(
'people.search_columns.givenname' => 'Valentine'
)),
array( '$unwind' => '$people' ),
array( '$match' => array(
'people.search_columns.givenname' => 'Valentine'
)),
array( '$group' => array(
'_id' => '$id',
'name' => array( '$first' => '$name' ),
'people' => array( '$push' => '$people' )
))
));
पहले का बिंदु $match
चरण उन दस्तावेजों को कम करना है जो संभवतः आपके मानदंडों से मेल खाते हैं। दूसरी बार $unwind<के बाद किया जाता है /कोड>
, जहां दस्तावेज़ में वास्तविक "सरणी" आइटम परिणामों से "फ़िल्टर" किए जाते हैं।
अंतिम $group
मूल सरणी को वापस सामान्य पर रखता है, उन मदों को घटाता है जो मानदंड से मेल नहीं खाते हैं।