Wie Arrayfeld in Dokument in Mongo-Aggregation zusammengeführt wird

9

Ich habe eine Anforderung, bei der ich eine Aggregation für zwei Datensätze durchführen muss, die beide ein Array-Feld mit unterschiedlichem Wert haben. Was ich brauche, wenn ich eine Aggregation für diese Datensätze mache, sollte das Ergebnis ein Array mit eindeutigen Werten von beiden verschiedenen Arrays haben. Hier ist ein Beispiel:

Erste Aufnahme

%Vor%

Zweiter Datensatz

%Vor%

Nach der Aggregation auf Host und Artid brauche ich folgendes Ergebnis:

%Vor%

Ich habe $addToset in der Gruppenanweisung versucht, aber es gibt mir diese Tags: [["tag1","tag2"],["tag2","tag3"]]

Könnten Sie mir bitte helfen, wie ich das in Aggregation erreichen kann

    
viren 13.11.2014, 08:56
quelle

1 Antwort

21

TLDR;

Moderne Veröffentlichungen sollten $reduce mit $setUnion nach dem ersten $group wie gezeigt:

%Vor%

Sie hatten recht, als Sie die $addToSet gefunden haben Wenn Sie jedoch mit Inhalten in einem Array arbeiten, müssen Sie im Allgemeinen mit $unwind zuerst. Dies "de-normalisiert" die Array-Einträge und erstellt im Wesentlichen eine "Kopie" des übergeordneten Dokuments mit jedem Array-Eintrag als einen singulären Wert in dem Feld. Das ist, was Sie brauchen, um das Verhalten zu vermeiden, das Sie sehen, ohne das zu benutzen.

Ihr "count" stellt zwar ein interessantes Problem dar, wird aber durch die Verwendung einer "doppelten Abwicklung" nach einer ersten $group Vorgang:

%Vor%

Das letzte bisschen mit $project ist auch da ich für jedes der Felder in anderen Stufen der Aggregationspipeline "temporäre" Namen verwendet habe. Dies liegt daran, dass es in $project eine Optimierung gibt "Kopiert" die Felder einer vorhandenen Stufe in der Reihenfolge, in der sie bereits erschienen sind, bevor "neue" Felder zum Dokument hinzugefügt werden.

Andernfalls würde die Ausgabe wie folgt aussehen:

%Vor%

Wo die Felder nicht in der gleichen Reihenfolge sind, wie Sie vielleicht denken. Trivial wirklich, aber es ist wichtig für einige Leute, also lohnt es sich zu erklären warum und wie man damit umgeht.

Also $unwind erledigt die Arbeit die Elemente werden getrennt und nicht in Arrays aufgeteilt und die $group ermöglicht Ihnen, die Anzahl der Vorkommen des Gruppierungsschlüssels zu ermitteln.

Der $first -Operator wird später verwendet "that" count "value", da er für jeden im Array "tags" vorhandenen Wert "dupliziert" wurde. Es ist sowieso der gleiche Wert, also spielt es keine Rolle. Wählen Sie einfach einen aus.

    
Neil Lunn 13.11.2014, 09:08
quelle