I MongoDB, $addToSet
operatorn lägger till ett värde till en array om inte värdet redan finns i arrayen.
Det liknar $push
operator, förutom att $push
lägger till värdet även om värdet redan finns.
Exempel
Anta att vi har en samling som heter products
med följande dokument:
db.products.find()
Resultat:
{ "_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" ] }
Vi kan använda $addToSet
för att lägga till ett värde till en av dessa arrayer.
Exempel:
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Utdata:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Låt oss ta en ny titt på vår samling för att verifiera ändringen:
db.products.find()
Resultat:
{ "_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" ] }
Duplicera värden
Om du försöker infoga ett värde som redan finns i arrayen händer ingenting. Med andra ord, $addToSet
infogar bara värdet om det inte redan finns.
Här är ett exempel på ett försök att infoga ett värde som redan finns.
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Utdata:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Det här meddelandet talar om för oss att det fanns ett matchande dokument (d.v.s. dokumentet med ett _id
av 1
), men det gjordes inga ändringar.
I föregående exempel såg vi "nModified" : 1
, men i det här exemplet ser vi "nModified" : 0
. Det beror på att värdet inte fanns när vi infogade det i föregående exempel, men i det här exemplet finns det redan.
Vi kan verifiera detta genom att titta på samlingen igen:
db.products.find()
Resultat:
{ "_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" ] }
Lägg till flera värden
Du kan använda $each
modifierare för att lägga till flera värden till en array.
Exempel:
db.products.update(
{ _id: 2 },
{
$addToSet: {
sizes: {
$each: [ "XXL", "XXXL" ]
}
}
}
)
Utdata:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Låt oss nu kontrollera samlingen igen:
db.products.find()
Resultat:
{ "_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" ] }
Vi kan se att de två värdena lades till arrayen i dokument 2 som förväntat.
Lägg till en array i arrayen
Du kan också lägga till en hel array till arrayen. När du gör detta läggs hela arrayen till som en egen separat array.
Anta att vi har en sådan här samling:
db.foo.find()
Resultat:
{ "_id" : 1, "bar" : [ 1, 5, 3 ] } { "_id" : 2, "bar" : [ 8, 17, 18 ] } { "_id" : 3, "bar" : [ 15, 11, 8 ] }
Vi kan lägga till en array till en array så här:
db.foo.update(
{ _id: 1 },
{ $addToSet: { bar: [ 7, 8, 9] } }
)
Utdata:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Kontrollera samlingen:
db.foo.find()
Resultat:
{ "_id" : 1, "bar" : [ 1, 5, 3, [ 7, 8, 9 ] ] } { "_id" : 2, "bar" : [ 8, 17, 18 ] } { "_id" : 3, "bar" : [ 15, 11, 8 ] }