В MongoDB, $addToSet
оператор добавя стойност към масив, освен ако стойността вече не присъства в масива.
Това е подобно на $push
оператор, с изключение на $push
добавя стойността, дори ако стойността вече е налице.
Пример
Да предположим, че имаме колекция, наречена products
със следните документи:
db.products.find()
Резултат:
{ "_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" ] }
Можем да използваме $addToSet
за да добавите стойност към един от тези масиви.
Пример:
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Изход:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Нека да разгледаме отново нашата колекция, за да проверим промяната:
db.products.find()
Резултат:
{ "_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" ] }
Дублиращи се стойности
Ако се опитате да вмъкнете стойност, която вече съществува в масива, нищо не се случва. С други думи, $addToSet
вмъква стойността само ако тя вече не съществува.
Ето пример за опит за вмъкване на стойност, която вече съществува.
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Изход:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Това съобщение ни казва, че е имало един съответстващ документ (т.е. документът с _id
от 1
), но нямаше промени.
В предишния пример видяхме "nModified" : 1
, но в този пример виждаме "nModified" : 0
. Това е така, защото стойността не е съществувала, когато я вмъкнахме в предишния пример, но в този пример вече съществува.
Можем да проверим това, като разгледаме колекцията отново:
db.products.find()
Резултат:
{ "_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" ] }
Добавяне на множество стойности
Можете да използвате $each
модификатор за добавяне на множество стойности към масив.
Пример:
db.products.update(
{ _id: 2 },
{
$addToSet: {
sizes: {
$each: [ "XXL", "XXXL" ]
}
}
}
)
Изход:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Сега нека проверим колекцията отново:
db.products.find()
Резултат:
{ "_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" ] }
Можем да видим, че двете стойности бяха добавени към масива в документ 2, както се очакваше.
Добавяне на масив към масива
Можете също да добавите цял масив към масива. Когато направите това, целият масив се добавя като негов отделен масив.
Да предположим, че имаме колекция като тази:
db.foo.find()
Резултат:
{ "_id" : 1, "bar" : [ 1, 5, 3 ] } { "_id" : 2, "bar" : [ 8, 17, 18 ] } { "_id" : 3, "bar" : [ 15, 11, 8 ] }
Можем да добавим масив към масив като този:
db.foo.update(
{ _id: 1 },
{ $addToSet: { bar: [ 7, 8, 9] } }
)
Изход:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Проверете колекцията:
db.foo.find()
Резултат:
{ "_id" : 1, "bar" : [ 1, 5, 3, [ 7, 8, 9 ] ] } { "_id" : 2, "bar" : [ 8, 17, 18 ] } { "_id" : 3, "bar" : [ 15, 11, 8 ] }