W MongoDB możesz użyć $pullAll
operatora, aby usunąć wszystkie wystąpienia określonych wartości z istniejącej tablicy.
Użyj $pullAll
w połączeniu z metodą taką jak update()
, updateOne()
lub updateMany()
aby zaktualizować określony dokument/y o zmianę.
Przykład
Załóżmy, że mamy kolekcję z następującymi dokumentami:
{ "_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 ] }
I powiedzmy, że chcemy usunąć wszystkie wartości 7
z tablicy w dokumencie 1.
Możemy to zrobić:
db.foo.update(
{ _id: 1 },
{ $pullAll: { bar: [ 7 ] } }
)
Wyjście:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Ta wiadomość mówi nam, że jeden dokument pasował, a jeden (tj. ten sam dokument) został zmodyfikowany.
Przyjrzyjmy się teraz kolekcji:
db.foo.find()
Wynik:
{ "_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 ] }
Widzimy, że tablica w dokumencie 1 ma wszystkie swoje 7
wartości usunięte zgodnie ze specyfikacją.
Usuń wiele wartości
Argument, który dostarczyliśmy do $pullAll
jest tablicą, dlatego możemy usunąć wiele wartości, oddzielając je przecinkiem.
Przykład:
db.foo.update(
{ _id: 2 },
{ $pullAll: { bar: [ 17, 18 ] } }
)
Wyjście:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Teraz ponownie sprawdźmy kolekcję:
db.foo.find()
Wynik:
{ "_id" : 1, "bar" : [ 1, 2, 3, 8, 1 ] } { "_id" : 2, "bar" : [ 0, 1, 8, 8 ] } { "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }
Widzimy, że wartości 17
i 18
zostały usunięte z tablicy w dokumencie 2.
Aktualizuj wszystkie dokumenty
Możesz dodać multi: true
lub użyj updateMany()
metoda aktualizacji wszystkich dokumentów, które spełniają kryteria.
Gdy to zrobisz, usuń wszelkie kryteria wyboru z pierwszego dokumentu zapytania (który określa, które dokumenty do zaktualizowania). Innymi słowy, użyj pustego dokumentu jako pierwszego argumentu funkcji update()
(lub updateMany()
).
Przykład:
db.foo.update(
{ },
{ $pullAll: { bar: [ 1, 8 ] } },
{ multi: true }
)
Wyjście:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
W tym przypadku widzimy, że trzy dokumenty zostały dopasowane (ponieważ w kolekcji są trzy dokumenty) i wszystkie trzy zostały zmodyfikowane (ponieważ wszystkie zawierały określone wartości).
Sprawdźmy jeszcze raz kolekcję:
db.foo.find()
Wynik:
{ "_id" : 1, "bar" : [ 2, 3 ] } { "_id" : 2, "bar" : [ 0 ] } { "_id" : 3, "bar" : [ 15, 11, 0, 3 ] }
Widzimy, że wszystkie instancje zostały zaktualizowane zgodnie z opisem.