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
Moderne Veröffentlichungen sollten $reduce
mit $setUnion
nach dem ersten $group
wie gezeigt:
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
Ihr "count" stellt zwar ein interessantes Problem dar, wird aber durch die Verwendung einer "doppelten Abwicklung" nach einer ersten $group
Vorgang:
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.
Tags und Links mongodb aggregation-framework mongodb-query