I MongoDB er $addToSet
operator tilføjer en værdi til et array, medmindre værdien allerede er til stede i arrayet.
Det ligner $push
operator, bortset fra at $push
tilføjer værdien, selvom værdien allerede er til stede.
Eksempel
Antag, at vi har en samling kaldet products
med følgende dokumenter:
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 bruge $addToSet
at tilføje en værdi til et af disse arrays.
Eksempel:
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Output:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Lad os se på vores samling igen for at bekræfte æ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" ] }
Dublerede værdier
Hvis du forsøger at indsætte en værdi, der allerede findes i arrayet, sker der ikke noget. Med andre ord, $addToSet
indsætter kun værdien, hvis den ikke allerede eksisterer.
Her er et eksempel på forsøg på at indsætte en værdi, der allerede eksisterer.
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Output:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Denne meddelelse fortæller os, at der var ét matchende dokument (dvs. dokumentet med en _id
af 1
), men der var ingen ændringer.
I det forrige eksempel så vi "nModified" : 1
, men i dette eksempel ser vi "nModified" : 0
. Det er fordi værdien ikke eksisterede, da vi indsatte den i det forrige eksempel, men i dette eksempel eksisterer den allerede.
Vi kan bekræfte dette ved at se 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" ] }
Tilføj flere værdier
Du kan bruge $each
modifikator for at tilføje flere værdier til en matrix.
Eksempel:
db.products.update(
{ _id: 2 },
{
$addToSet: {
sizes: {
$each: [ "XXL", "XXXL" ]
}
}
}
)
Output:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Lad os nu tjekke 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, at de to værdier blev tilføjet til arrayet i dokument 2 som forventet.
Tilføj et array til arrayet
Du kan også tilføje et helt array til arrayet. Når du gør dette, tilføjes hele arrayet som sit eget separate array.
Antag, at vi har en samling som denne:
db.foo.find()
Resultat:
{ "_id" : 1, "bar" : [ 1, 5, 3 ] } { "_id" : 2, "bar" : [ 8, 17, 18 ] } { "_id" : 3, "bar" : [ 15, 11, 8 ] }
Vi kan tilføje et array til et array som dette:
db.foo.update(
{ _id: 1 },
{ $addToSet: { bar: [ 7, 8, 9] } }
)
Output:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Tjek 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 ] }