Come ripristinare il documento originale dopo l’aggregazione

Ho un caso in cui voglio interrogare una raccolta di documenti che hanno un numero di elementi sotto un campo di matrice “moduli”. Il problema da risolvere era voler restituire solo i documenti che hanno tutti i documenti contenuti in “moduli” con uno stato particolare di “chiuso”.

Quindi ecco un esempio di due diversi documenti nella collezione:

{ "_id" : "Tvq444454j", "name" : "Jim", "forms" : [ { "name" : "Jorney", "status" : "closed" }, { "name" : "Women", "status" : "void" }, { "name" : "Child", "status" : "closed" }, { "name" : "Farm", "status" : "closed" } ] }, { "_id" : "Tvq579754r", "name" : "Tom", "forms" : [ { "name" : "PreOp", "status" : "closed" }, { "name" : "Alert", "status" : "closed" }, { "name" : "City", "status" : "closed" }, { "name" : "Country", "status" : "closed" } ] } 

E il risultato atteso:

 { "_id" : "Tvq579754r", "name" : "Tom", "forms" : [ { "name" : "PreOp", "status" : "closed" }, { "name" : "Alert", "status" : "closed" }, { "name" : "City", "status" : "closed" }, { "name" : "Country", "status" : "closed" } ] } 

Poiché non esiste un operatore di query standard per abbinare tutti gli elementi dell’array in questa condizione, la soluzione è stata trovata utilizzando l’aggregazione. Ciò restituirebbe _id dei documenti nella raccolta che hanno tutti i loro elementi “forms” impostati sullo stato di “chiuso”.

 db.forms.aggregate([ {$unwind: "$forms" }, {$group: { _id: "$_id", status: {$addToSet: "$forms.status" }}}, {$unwind: "$status"}, {$sort: { _id: 1, status: -1 }}, {$group: {_id: "$_id", status: {$first: "$status"}}}, {$match:{ status: "closed" }} ]) 

Quindi, poiché mi aspetto di restituire molti documenti nei risultati, vorrei evitare di pubblicare un’altra ricerca o serie di reperti solo per ottenere i documenti corrispondenti ai _id di ritorno.

Considerando questo, c’è un modo per recuperare i documenti originali dall’aggregazione esattamente nella stessa forma in cui sono nella raccolta, mentre faccio ancora questo tipo di filtro?