Étant donné que les tableaux sont imbriqués, vous ne pouvez pas utiliser la projection de base comme vous le pouvez avec find. De plus, pour "filtrer" le contenu du tableau d'un document, vous devez d'abord "dérouler" le contenu du tableau. Pour cela vous utilisez le framework d'agrégation :
$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' )
))
));
Le point du premier $match
consiste à réduire les documents qui correspondent éventuellement à vos critères. La deuxième fois est effectuée après le $unwind
, où les éléments réels du "tableau" dans le document sont "filtrés" des résultats.
Le dernier $group
remet le tableau d'origine à la normale, moins les éléments qui ne correspondent pas aux critères.