Ponieważ tablice są zagnieżdżone, nie można używać podstawowego rzutowania, jak w przypadku find. Również w celu "odfiltrowania" zawartości tablicy z dokumentu należy najpierw "odwinąć" zawartość tablicy. W tym celu używasz struktury agregacji:
$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' )
))
));
Punkt pierwszego $match
etapem jest redukcja dokumentów, które ewentualnie odpowiadają Twoim kryteriom. Drugi raz odbywa się po $unwind
, gdzie rzeczywiste elementy „tablicy” w dokumencie są „odfiltrowywane” od wyników.
Ostatnia $group
przywraca oryginalną tablicę do stanu normalnego, bez elementów, które nie spełniają kryteriów.