In MongoDB ist das $addToSet
-Operator fügt einem Array einen Wert hinzu, es sei denn, der Wert ist bereits im Array vorhanden.
Es ähnelt dem $push
-Operator, außer dass $push
fügt den Wert hinzu, auch wenn der Wert bereits vorhanden ist.
Beispiel
Angenommen, wir haben eine Sammlung namens products
mit folgenden Dokumenten:
db.products.find()
Ergebnis:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
Wir können $addToSet
verwenden um einen Wert an eines dieser Arrays anzuhängen.
Beispiel:
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Ausgabe:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Sehen wir uns unsere Sammlung noch einmal an, um die Änderung zu überprüfen:
db.products.find()
Ergebnis:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L", "XL" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
Doppelte Werte
Wenn Sie versuchen, einen Wert einzufügen, der bereits im Array vorhanden ist, passiert nichts. Mit anderen Worten, $addToSet
fügt den Wert nur ein, wenn er noch nicht existiert.
Hier ist ein Beispiel für den Versuch, einen bereits vorhandenen Wert einzufügen.
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Ausgabe:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Diese Nachricht teilt uns mit, dass es ein übereinstimmendes Dokument gab (d. h. das Dokument mit einer _id
von 1
), aber es gab keine Änderungen.
Im vorherigen Beispiel haben wir "nModified" : 1
gesehen , aber in diesem Beispiel sehen wir "nModified" : 0
. Das liegt daran, dass der Wert nicht existierte, als wir ihn im vorherigen Beispiel eingefügt haben, aber in diesem Beispiel ist er bereits vorhanden.
Wir können dies überprüfen, indem wir uns die Sammlung erneut ansehen:
db.products.find()
Ergebnis:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L", "XL" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
Mehrere Werte hinzufügen
Sie können den $each
verwenden Modifikator, um mehrere Werte an ein Array anzuhängen.
Beispiel:
db.products.update(
{ _id: 2 },
{
$addToSet: {
sizes: {
$each: [ "XXL", "XXXL" ]
}
}
}
)
Ausgabe:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Lassen Sie uns nun die Sammlung erneut überprüfen:
db.products.find()
Ergebnis:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L", "XL" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL", "XXL", "XXXL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
Wir können sehen, dass die beiden Werte wie erwartet an das Array in Dokument 2 angehängt wurden.
Fügen Sie dem Array ein Array hinzu
Sie können auch ein ganzes Array an das Array anhängen. Wenn Sie dies tun, wird das gesamte Array als eigenes separates Array angehängt.
Angenommen, wir haben eine Sammlung wie diese:
db.foo.find()
Ergebnis:
{ "_id" : 1, "bar" : [ 1, 5, 3 ] } { "_id" : 2, "bar" : [ 8, 17, 18 ] } { "_id" : 3, "bar" : [ 15, 11, 8 ] }
Wir können ein Array wie folgt an ein Array anhängen:
db.foo.update(
{ _id: 1 },
{ $addToSet: { bar: [ 7, 8, 9] } }
)
Ausgabe:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Prüfen Sie die Sammlung:
db.foo.find()
Ergebnis:
{ "_id" : 1, "bar" : [ 1, 5, 3, [ 7, 8, 9 ] ] } { "_id" : 2, "bar" : [ 8, 17, 18 ] } { "_id" : 3, "bar" : [ 15, 11, 8 ] }