Eftersom arrayerna är kapslade kan du inte använda grundläggande projektion som du kan med find. Också för att "filtrera" matrisinnehållet från ett dokument måste du först "linda upp" matrisinnehållet. För detta använder du aggregeringsramverket:
$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' )
))
));
Poängen med den första $match
steget är att minska de dokument som eventuellt matchar dina kriterier. Den andra gången görs efter $unwind
, där de faktiska "array"-objekten i dokumentet "filtreras" från resultaten.
Den sista $group
återställer den ursprungliga arrayen till det normala, minus de objekt som inte matchar kriterierna.