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.