Protože jsou pole vnořená, nemůžete použít základní projekci jako u find. Abyste mohli „filtrovat“ obsah pole z dokumentu, musíte nejprve „rozvinout“ obsah pole. K tomu použijete agregační rámec:
$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' )
))
));
Pointa prvního $match
fázi je zredukovat dokumenty, které mohou odpovídat vašim kritériím. Podruhé se provede po $unwind
, kde jsou skutečné položky "pole" v dokumentu "filtrovány" z výsledků.
Poslední $group
vrátí původní pole zpět do normálu, mínus položky, které neodpovídají kritériím.