Valt onder de categorie domme aggregatietrucs is een kleine techniek die vaak over het hoofd wordt gezien.
De query doet al zijn groepering rond het document _id, zijnde de unieke identificatie voor dit document. Dus het belangrijkste punt om aan te denken is het hele document is eigenlijk al een unieke identifier. Dus in plaats van alleen de _id-sleutel op te bergen, gebruik je het hele document.
{$project: {
_id: { _id: "$_id", name: "$name", forms: "$forms" }, forms: "$forms"}
},
Waar dit wordt gedaan, behoudt alles wat door de _id wordt opgerold het document in zijn oorspronkelijke vorm. Geef aan het einde van alle andere aggregatiefasen een definitief $project om de echte originele documentvorm te herstellen:
{$project: { _id: "$_id._id", name: "$_id.name", forms: "$_id.forms"}}
Dan heb je de gefilterde resultaten die je wilt. Deze techniek kan erg handig zijn bij gebruik met geavanceerde filtering, zoals in het geval van deze zoekopdracht, omdat er geen extra vondst nodig is. op alle resultaten.
In een dergelijk geval waarin u weet dat u alleen op zoek bent naar een reeks resultaten die aan een bepaalde reeks voorwaarden voldoen, gebruikt u een $match operator als de eerste fase van de aggregatiepijplijn. Dit is niet alleen handig om de grootte van de werkset te verkleinen, maar het is ook de enige stadium waarin u gebruik kunt maken van een index en waar u de prestaties van zoekopdrachten aanzienlijk kunt verbeteren.
Het hele proces samen:
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"}}
])