Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
$hinzufügen ToSet
Der $addToSet Aggregationsoperator gibt ein Array mit eindeutigen Werten aus einem angegebenen Ausdruck für jede Gruppe zurück. Er wird innerhalb der $group Phase verwendet, um unterschiedliche Werte zu akkumulieren und Duplikate automatisch zu eliminieren.
Parameter
-
expression: Der Ausdruck, der für jedes Dokument in der Gruppe ausgewertet werden soll.
Beispiel (MongoDB Shell)
Das folgende Beispiel zeigt, wie der $addToSet Operator verwendet wird, um für jeden Kunden eindeutige Städte zu erfassen, in denen Bestellungen aufgegeben wurden.
Erstellen Sie Beispieldokumente
db.orders.insertMany([ { _id: 1, customer: "Alice", city: "Seattle", amount: 100 }, { _id: 2, customer: "Alice", city: "Portland", amount: 150 }, { _id: 3, customer: "Bob", city: "Seattle", amount: 200 }, { _id: 4, customer: "Alice", city: "Seattle", amount: 75 }, { _id: 5, customer: "Bob", city: "Boston", amount: 300 } ]);
Beispiel für eine Abfrage
db.orders.aggregate([ { $group: { _id: "$customer", cities: { $addToSet: "$city" } } } ]);
Ausgabe
[
{ _id: 'Bob', cities: [ 'Seattle', 'Boston' ] },
{ _id: 'Alice', cities: [ 'Seattle', 'Portland' ] }
]
Beispiel für die Verwendung von Fensteroperatoren (MongoDB Shell)
Neu ab Version 8.0.2.
Der $addToSet Operator kann auch als Fensterbediener auf der $setWindowFields Bühne verwendet werden. In diesem Zusammenhang gibt es ein Array mit den eindeutigen Werten des angegebenen Ausdrucks für die Dokumente in jedem Fenster zurück. Sie geben den Operator unter dem output Feld an und definieren optional die Fenstergrenzen mit einem window Dokument.
Anmerkung
Bei Verwendung als Fensteroperator in $setWindowFields $addToSet ist er auf 100 MB an Zwischendaten begrenzt. Eine Operation, die dieses Limit überschreitet, gibt einen Fehler zurück.
Erstellen Sie Beispieldokumente
db.visits.insertMany([ { _id: 1, customer: "Alice", day: 1, city: "Seattle" }, { _id: 2, customer: "Alice", day: 2, city: "Portland" }, { _id: 3, customer: "Alice", day: 3, city: "Seattle" }, { _id: 4, customer: "Bob", day: 1, city: "Boston" }, { _id: 5, customer: "Bob", day: 2, city: "Boston" } ]);
Beispiel für eine Abfrage
Das folgende Beispiel partitioniert die Dokumente nachcustomer, sortiert jede Partition nach day und gibt die Gruppe der city Einzelwerte vom Anfang der Partition bis zum aktuellen Dokument zurück.
db.visits.aggregate([ { $setWindowFields: { partitionBy: "$customer", sortBy: { day: 1 }, output: { citiesSoFar: { $addToSet: "$city", window: { documents: ["unbounded", "current"] } } } } } ]);
Ausgabe
[
{ "_id": 1, "customer": "Alice", "day": 1, "city": "Seattle", "citiesSoFar": [ "Seattle" ] },
{ "_id": 2, "customer": "Alice", "day": 2, "city": "Portland", "citiesSoFar": [ "Portland", "Seattle" ] },
{ "_id": 3, "customer": "Alice", "day": 3, "city": "Seattle", "citiesSoFar": [ "Portland", "Seattle" ] },
{ "_id": 4, "customer": "Bob", "day": 1, "city": "Boston", "citiesSoFar": [ "Boston" ] },
{ "_id": 5, "customer": "Bob", "day": 2, "city": "Boston", "citiesSoFar": [ "Boston" ] }
]
Jedes Dokument wird vom Anfang bis zum aktuellen Dokument um die Gruppe von city Einzelwerten innerhalb seiner Partition erweitert. citiesSoFar Wie bei der Akkumulatorform ist die Reihenfolge der Werte im zurückgegebenen Array nicht garantiert.
Codebeispiele
Um ein Codebeispiel für die Verwendung des $addToSet Operators anzuzeigen, wählen Sie die Registerkarte für die Sprache, die Sie verwenden möchten. Die folgenden Beispiele zeigen sowohl die Verwendung des Akkumulators (in$group) als auch die Verwendung von Fensteroperatoren (in$setWindowFields):