W MongoDB możesz użyć $pull
operator do usuwania wartości z tablicy.
Użyj $pull
w połączeniu z metodą taką jak update()
aby zaktualizować określony dokument ze zmianą.
Przykład
Załóżmy, że mamy kolekcję o nazwie products
z następującymi dokumentami:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL", "XXL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
Możemy usunąć element z tablicy w dokumencie 1 w ten sposób:
db.products.update(
{ _id: 1 },
{ $pull: { sizes: "XXL" } }
)
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.products.find()
Wynik:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
Widzimy, że tablica w dokumencie 1 miała wartość XXL
usunięte zgodnie z opisem.
Usuń wiele wartości
Możemy użyć $in
operatora, aby określić wiele wartości, które chcemy usunąć z tablicy.
Przykład:
db.products.update(
{ _id: 3 },
{ $pull: { sizes: { $in: ["XS", "XL"] } } }
)
Wyjście:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Teraz ponownie sprawdźmy kolekcję:
db.products.find()
Wynik:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }
Widzimy, że dwa określone elementy zostały usunięte z tablicy w dokumencie 3.
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ń wszystkie 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.products.update(
{ },
{ $pull: { sizes: "XL" } },
{ multi: true }
)
Wyjście:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
W tym przypadku widzimy, że pasowały trzy dokumenty (ponieważ w kolekcji są trzy dokumenty), ale tylko dwa zostały zmodyfikowane (ponieważ tylko dwa miały wartość XL
w sizes
tablica).
I ponownie sprawdź kolekcję:
db.products.find()
Wynik:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }
Widzimy, że wszystkie wystąpienia XL
zostały usunięte ze wszystkich dokumentów w kolekcji.
Tablica dokumentów
Jeśli masz tablicę zawierającą dokumenty jako swoje elementy, możesz usunąć dowolny z tych dokumentów, określając kryteria, które pasują do danych w dokumencie.
Załóżmy, że mamy kolekcję o nazwie restauracje, która zawiera następujące dokumenty:
{ "_id" : 1, "name" : "The Rat", "reviews" : [ { "name" : "Stanley", "date" : "04 December, 2020", "ordered" : "Dinner", "rating" : 1 }, { "name" : "Tom", "date" : "04 October, 2020", "ordered" : "Lunch", "rating" : 2 } ] } { "_id" : 2, "name" : "Yum Palace", "reviews" : [ { "name" : "Stacey", "date" : "08 December, 2020", "ordered" : "Lunch", "rating" : 3 }, { "name" : "Tom", "date" : "08 October, 2020", "ordered" : "Breakfast", "rating" : 4 } ] } { "_id" : 3, "name" : "Boardwalk Cafe", "reviews" : [ { "name" : "Steve", "date" : "20 December, 2020", "ordered" : "Breakfast", "rating" : 5 }, { "name" : "Lisa", "date" : "25 October, 2020", "ordered" : "Dinner", "rating" : 5 }, { "name" : "Kim", "date" : "21 October, 2020", "ordered" : "Dinner", "rating" : 5 } ] }
W tym przypadku pole o nazwie reviews
zawiera szereg dokumentów. Każdy dokument jest inną recenzją danej restauracji.
Moglibyśmy użyć $pull
aby usunąć opinie spełniające określone kryteria.
Przykład:
db.restaurants.update(
{ },
{ $pull: { reviews: { rating: { $lt: 4 } } } },
{ multi: true }
)
Wyjście:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
Ta wiadomość mówi nam, że trzy dokumenty pasowały do kryteriów zapytania (ponieważ wybraliśmy wszystkie dokumenty), a dwa dokumenty zostały zmodyfikowane (ponieważ dwa pasowały do naszego $pull
kryteria).
Sprawdźmy ponownie kolekcję, aby zobaczyć efekt:
db.restaurants.find().pretty()
Wynik:
{ "_id" : 1, "name" : "The Rat", "reviews" : [ ] } { "_id" : 2, "name" : "Yum Palace", "reviews" : [ { "name" : "Tom", "date" : "08 October, 2020", "ordered" : "Breakfast", "rating" : 4 } ] } { "_id" : 3, "name" : "Boardwalk Cafe", "reviews" : [ { "name" : "Steve", "date" : "20 December, 2020", "ordered" : "Breakfast", "rating" : 5 }, { "name" : "Lisa", "date" : "25 October, 2020", "ordered" : "Dinner", "rating" : 5 }, { "name" : "Kim", "date" : "21 October, 2020", "ordered" : "Dinner", "rating" : 5 } ] }
Widzimy, że pozostały tylko recenzje z oceną 4 i wyższą. Wszystkie recenzje mniej niż 4 zostały usunięte.