Da arrays er indlejret, kan du ikke bruge grundlæggende projektion, som du kan med find. Også for at "filtrere" matrixindholdet fra et dokument, skal du "afvikle" matrixindholdet først. Til dette bruger du aggregeringsrammen:
$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' )
))
));
Pointen med den første $match
fase er at reducere de dokumenter, der muligvis matcher dine kriterier. Anden gang sker efter $unwind
, hvor de faktiske "array"-elementer i dokumentet "filtreres" fra resultaterne.
Den sidste $group
sætter det oprindelige array tilbage til det normale, minus de elementer, der ikke matcher kriterierne.