MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So erhalten Sie das Originaldokument nach der Aggregation zurück

Fällt unter die Kategorie der dummen Aggregationstricks ist eine kleine Technik, die oft übersehen wird.

Die Abfrage, die das alles erledigt, gruppiert sich um das Dokument _id, das die eindeutige Kennung für dieses Dokument ist. Der Hauptpunkt ist also das gesamte Dokument ist eigentlich schon eine eindeutige Kennung. Anstatt also nur den Schlüssel _id zu verstecken, verwenden Sie das gesamte Dokument.

    {$project: { 
        _id: { _id: "$_id", name: "$name", forms: "$forms" }, forms: "$forms"}
    },

Wo dies getan wird, behält alles, was durch die _id aufgerollt wird, das Dokument in seiner ursprünglichen Form. Geben Sie am Ende aller anderen Aggregationsphasen ein abschließendes $project aus um die wahre ursprüngliche Dokumentenform wiederherzustellen:

    {$project: { _id: "$_id._id", name: "$_id.name", forms: "$_id.forms"}}

Dann haben Sie die gewünschten gefilterten Ergebnisse. Diese Technik kann sehr praktisch sein, wenn sie mit erweiterten Filtern verwendet wird, wie im Fall dieser Abfrage, da sie die Notwendigkeit beseitigt, ein zusätzliches find auszugeben auf alle Ergebnisse.

Verwenden Sie in einem solchen Fall, in dem Sie wissen, dass Sie nur nach einer Reihe von Ergebnissen suchen, die bestimmten Bedingungen entsprechen, ein $match Operator als erster Stufe der Aggregationspipeline. Dies ist nicht nur nützlich, um die Arbeitssatzgröße zu reduzieren, sondern auch einzig Phase, in der Sie einen Index verwenden können und wo Sie die Abfrageleistung erheblich steigern können.

Der gesamte Prozess zusammen:

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"}}
])