Omdat de arrays genest zijn, kun je geen basisprojectie gebruiken zoals je kunt met find. Om de array-inhoud van een document te "filteren" moet u eerst de array-inhoud "afwikkelen". Hiervoor gebruik je het aggregatieraamwerk:
$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' )
))
));
Het punt van de eerste $match
stap is het verminderen van de documenten die mogelijk aan uw criteria voldoen. De tweede keer wordt gedaan na de $unwind
, waarbij de werkelijke "array"-items in het document worden "gefilterd" uit de resultaten.
De laatste $group
zet de originele array terug naar normaal, minus de items die niet aan de criteria voldoen.