W MongoDB $addToSet
operator dodaje wartość do tablicy, chyba że wartość jest już obecna w tablicy.
Jest podobny do $push
operator, z wyjątkiem tego, że $push
dodaje wartość, nawet jeśli wartość jest już obecna.
Przykład
Załóżmy, że mamy kolekcję o nazwie products
z następującymi dokumentami:
db.products.find()
Wynik:
{ "_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" ] }
Możemy użyć $addToSet
aby dołączyć wartość do jednej z tych tablic.
Przykład:
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Wyjście:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Przyjrzyjmy się jeszcze raz naszej kolekcji, aby zweryfikować zmianę:
db.products.find()
Wynik:
{ "_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" ] }
Zduplikowane wartości
Jeśli spróbujesz wstawić wartość, która już istnieje w tablicy, nic się nie dzieje. Innymi słowy, $addToSet
wstawia wartość tylko wtedy, gdy jeszcze nie istnieje.
Oto przykład próby wstawienia wartości, która już istnieje.
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Wyjście:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Ta wiadomość informuje nas, że istnieje jeden pasujący dokument (tj. dokument z _id
z 1
), ale nie było żadnych modyfikacji.
W poprzednim przykładzie widzieliśmy "nModified" : 1
, ale w tym przykładzie widzimy "nModified" : 0
. Dzieje się tak, ponieważ wartość nie istniała, gdy wstawiliśmy ją w poprzednim przykładzie, ale w tym przykładzie już istnieje.
Możemy to zweryfikować, ponownie przyglądając się kolekcji:
db.products.find()
Wynik:
{ "_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" ] }
Dodaj wiele wartości
Możesz użyć $each
modyfikator do dołączania wielu wartości do tablicy.
Przykład:
db.products.update(
{ _id: 2 },
{
$addToSet: {
sizes: {
$each: [ "XXL", "XXXL" ]
}
}
}
)
Wyjście:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Teraz ponownie sprawdźmy kolekcję:
db.products.find()
Wynik:
{ "_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" ] }
Widzimy, że obie wartości zostały dołączone do tablicy w dokumencie 2 zgodnie z oczekiwaniami.
Dodaj tablicę do tablicy
Do tablicy można również dołączyć całą tablicę. Gdy to zrobisz, cała tablica zostanie dołączona jako oddzielna tablica.
Załóżmy, że mamy taką kolekcję:
db.foo.find()
Wynik:
{ "_id" : 1, "bar" : [ 1, 5, 3 ] } { "_id" : 2, "bar" : [ 8, 17, 18 ] } { "_id" : 3, "bar" : [ 15, 11, 8 ] }
Możemy dołączyć tablicę do tablicy w ten sposób:
db.foo.update(
{ _id: 1 },
{ $addToSet: { bar: [ 7, 8, 9] } }
)
Wyjście:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Sprawdź kolekcję:
db.foo.find()
Wynik:
{ "_id" : 1, "bar" : [ 1, 5, 3, [ 7, 8, 9 ] ] } { "_id" : 2, "bar" : [ 8, 17, 18 ] } { "_id" : 3, "bar" : [ 15, 11, 8 ] }