В MongoDB можете да използвате $pullAll
оператор за премахване на всички екземпляри на посочените стойности от съществуващ масив.
Използвайте $pullAll
във връзка с метод като update()
, updateOne()
или updateMany()
за да актуализирате посочения/ите документ/и с промяната.
Пример
Да предположим, че имаме колекция със следните документи:
{ "_id" : 1, "bar" : [ 1, 7, 2, 3, 8, 7, 1 ] } { "_id" : 2, "bar" : [ 0, 1, 8, 17, 18, 8 ] } { "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }
И да кажем, че искаме да премахнем всички стойности на 7
от масива в документ 1.
Можем да направим това:
db.foo.update(
{ _id: 1 },
{ $pullAll: { bar: [ 7 ] } }
)
Изход:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Това съобщение ни казва, че един документ съответства и един (т.е. същият документ) е променен.
Нека да разгледаме колекцията сега:
db.foo.find()
Резултат:
{ "_id" : 1, "bar" : [ 1, 2, 3, 8, 1 ] } { "_id" : 2, "bar" : [ 0, 1, 8, 17, 18, 8 ] } { "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }
Можем да видим, че масивът в документ 1 е имал всичките си 7
стойностите са премахнати, както е посочено.
Премахване на множество стойности
Аргументът, който предоставихме на $pullAll
е масив и затова можем да премахнем множество стойности, като ги разделим със запетая.
Пример:
db.foo.update(
{ _id: 2 },
{ $pullAll: { bar: [ 17, 18 ] } }
)
Изход:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Сега нека проверим колекцията отново:
db.foo.find()
Резултат:
{ "_id" : 1, "bar" : [ 1, 2, 3, 8, 1 ] } { "_id" : 2, "bar" : [ 0, 1, 8, 8 ] } { "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }
Можем да видим, че стойностите 17
и 18
са премахнати от масива в документ 2.
Актуализиране на всички документи
Можете да добавите multi: true
или използвайте updateMany()
метод за актуализиране на всички документи, които отговарят на критериите.
Когато направите това, премахнете всички критерии за избор от първия документ за заявка (който указва кой/ите документ/и да актуализирате). С други думи, използвайте празен документ като първи аргумент за update()
(или updateMany()
) метод.
Пример:
db.foo.update(
{ },
{ $pullAll: { bar: [ 1, 8 ] } },
{ multi: true }
)
Изход:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
В този случай можем да видим, че три документа съвпадат (тъй като в колекцията има три документа) и трите са променени (тъй като всички съдържат посочените стойности).
Нека проверим колекцията отново:
db.foo.find()
Резултат:
{ "_id" : 1, "bar" : [ 2, 3 ] } { "_id" : 2, "bar" : [ 0 ] } { "_id" : 3, "bar" : [ 15, 11, 0, 3 ] }
Можем да видим, че всички екземпляри са актуализирани, както е посочено.