Dado que las matrices están anidadas, no puede usar la proyección básica como puede hacerlo con find. Además, para "filtrar" el contenido de la matriz de un documento, primero debe "desenrollar" el contenido de la matriz. Para ello, utiliza el marco de agregación:
$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' )
))
));
El punto del primer $match
etapa es reducir los documentos que posiblemente coincidan con sus criterios. La segunda vez se realiza después de $unwind
, donde los elementos reales de la "matriz" en el documento se "filtran" de los resultados.
El $group
final
devuelve la matriz original a la normalidad, menos los elementos que no coinciden con los criterios.