Da die Arrays verschachtelt sind, können Sie die einfache Projektion nicht wie bei find verwenden. Auch um den Array-Inhalt aus einem Dokument zu "filtern", müssen Sie den Array-Inhalt zuerst "auflösen". Dazu verwenden Sie das Aggregationsframework:
$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' )
))
));
Der Punkt des ersten $match
Phase ist es, die Dokumente zu reduzieren, die möglicherweise Ihren Kriterien entsprechen. Das zweite Mal erfolgt nach dem $unwind
, wo die tatsächlichen "Array"-Elemente im Dokument aus den Ergebnissen "gefiltert" werden.
Der letzte $group
setzt das ursprüngliche Array wieder auf normal, abzüglich der Elemente, die nicht den Kriterien entsprechen.