Falder under kategorien dumme sammenlægningstricks er en lille teknik, der ofte bliver overset.
Forespørgslen, der udfører det hele, grupperer sig omkring dokumentet _id, som er den unikke identifikator for dette dokument. Så det vigtigste punkt at tænke på er hele dokumentet er faktisk allerede en unik identifikator. Så i stedet for blot at gemme _id-nøglen, skal du bruge hele dokumentet.
{$project: {
_id: { _id: "$_id", name: "$name", forms: "$forms" }, forms: "$forms"}
},
Hvor dette gøres, bevarer noget, der er rullet op af _id'et, dokumentet i sin originale form. Ved afslutningen af alle andre aggregeringsstadier skal du udstede et endeligt $projekt for at gendanne den ægte originale dokumentformular:
{$project: { _id: "$_id._id", name: "$_id.name", forms: "$_id.forms"}}
Så vil du have de filtrerede resultater, du ønsker. Denne teknik kan være meget praktisk, når den bruges sammen med avanceret filtrering, såsom i tilfælde af denne forespørgsel, da den fjerner behovet for at udstede et yderligere find på alle resultaterne.
I et sådant tilfælde, hvor du ved, at du kun leder efter et sæt resultater, der vil matche et bestemt sæt betingelser, skal du bruge en $match operatør som den første fase af aggregeringsrørledningen. Dette er ikke kun nyttigt til at reducere arbejdssættets størrelse, men det er også det eneste trin, hvor du kan gøre brug af et indeks og hvor du kan øge forespørgselsydeevnen markant.
Hele processen sammen:
db.forms.aggregate([
{$match: { "forms.status": "closed" } },
{$project: {
_id: { _id: "$_id", name: "$name", forms: "$forms" }, forms: "$forms"}
},
{$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"}},
{$project: { _id: "$_id._id", name: "$_id.name", forms: "$_id.forms"}}
])