¿Utiliza “aggregate” para combinar una lista de todos los subdocumentos que coinciden con la consulta?

Intento usar una biblioteca PHP mongo para “agregar” en una estructura de datos como esta:

{ "_id": 100, "name": "Joe", "pets":[ { "name": "Kill me", "animal": "Frog" }, { "name": "Petrov", "animal": "Cat" }, { "name": "Joe", "animal": "Frog" } ] }, { "_id": 101, "name": "Jane", "pets":[ { "name": "James", "animal": "Hedgehog" }, { "name": "Franklin", "animal": "Frog" } } 

Por ejemplo, si quiero obtener todos los subdocumentos donde el animal es una rana. Tenga en cuenta que NO quiero que todos los “super documentos” coincidan (es decir, los que tienen _id). Quiero obtener un ARRAY que se vea así:

  [ { "name": "Kill me", "animal": "Frog" }, { "name": "Joe", "animal": "Frog" }, { "name": "Franklin", "animal": "Frog" } ] 

¿Qué syntax se supone que debo usar (en PHP) para lograr esto? Sé que tiene que ver con agregado, pero no pude encontrar nada que coincida con este escenario específico.

Puede usar la agregación a continuación. $match para encontrar documentos donde la matriz tiene un valor de Frog y $unwind la matriz de pets . $match donde el documento tiene Frog y el último paso es group los documentos coincidentes en una matriz.

 < ?php $mongo = new MongoDB\Driver\Manager("mongodb://localhost:27017"); $pipeline = [ [ '$match' => [ 'pets.animal' => 'Frog', ], ], [ '$unwind' =>'$pets', ], [ '$match' => [ 'pets.animal' => 'Frog', ], ], [ '$group' => [ '_id' => null, 'animals' => ['$push' => '$pets'], ], ], ]; $command = new \MongoDB\Driver\Command([ 'aggregate' => 'insert_collection_name', 'pipeline' => $pipeline ]); $cursor = $mongo->executeCommand('insert_db_name', $command); foreach($cursor as $key => $document) { //do something } ?>