V MongoDB můžete použít $pull
operátor k odstranění hodnot z pole.
Použijte $pull
ve spojení s metodou, jako je update()
aktualizovat zadaný dokument změnou.
Příklad
Předpokládejme, že máme kolekci nazvanou products
s následujícími dokumenty:
{ "_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" ] }
Prvek z pole v dokumentu 1 můžeme odstranit takto:
db.products.update(
{ _id: 1 },
{ $pull: { sizes: "XXL" } }
)
Výstup:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Tato zpráva nám říká, že jeden dokument se shodoval a jeden (tj. stejný dokument) byl upraven.
Pojďme se nyní podívat na kolekci:
db.products.find()
Výsledek:
{ "_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" ] }
Vidíme, že pole v dokumentu 1 má svou hodnotu XXL
odstraněn, jak je uvedeno.
Odebrat více hodnot
Můžeme použít $in
operátor k zadání více hodnot, které chceme z pole odstranit.
Příklad:
db.products.update(
{ _id: 3 },
{ $pull: { sizes: { $in: ["XS", "XL"] } } }
)
Výstup:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Nyní znovu zkontrolujeme sbírku:
db.products.find()
Výsledek:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }
Můžeme vidět, že dva zadané prvky byly odstraněny z pole v dokumentu 3.
Aktualizovat všechny dokumenty
Můžete přidat multi: true
nebo použijte updateMany()
metoda k aktualizaci všech dokumentů, které odpovídají kritériím.
Když to uděláte, odeberte všechna kritéria výběru z prvního dokumentu dotazu (který určuje, které dokumenty se mají aktualizovat). Jinými slovy, použijte prázdný dokument jako první argument update()
(nebo updateMany()
) metoda.
Příklad:
db.products.update(
{ },
{ $pull: { sizes: "XL" } },
{ multi: true }
)
Výstup:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
V tomto případě vidíme, že tři dokumenty odpovídaly (protože ve sbírce jsou tři dokumenty), ale pouze dva byly upraveny (protože pouze dva měly hodnotu XL
v sizes
pole).
A znovu zkontrolujte sbírku:
db.products.find()
Výsledek:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }
Vidíme, že všechny instance XL
byly odstraněny ze všech dokumentů ve sbírce.
Pole dokumentů
Pokud máte pole obsahující jako prvky dokumenty, můžete kterýkoli z těchto dokumentů odstranit zadáním kritérií, která odpovídají datům v dokumentu.
Předpokládejme, že máme kolekci nazvanou restaurace, která dokumentuje následující:
{ "_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 } ] }
V tomto případě pole s názvem reviews
obsahuje řadu dokumentů. Každý dokument představuje jinou recenzi dané restaurace.
Mohli bychom použít $pull
k odstranění recenzí, které odpovídají určitým kritériím.
Příklad:
db.restaurants.update(
{ },
{ $pull: { reviews: { rating: { $lt: 4 } } } },
{ multi: true }
)
Výstup:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
Tato zpráva nám říká, že tři dokumenty odpovídaly kritériím dotazu (protože jsme vybrali všechny dokumenty) a dva dokumenty byly upraveny (protože dva odpovídaly našemu $pull
kritéria).
Podívejme se znovu na kolekci, abychom viděli efekt:
db.restaurants.find().pretty()
Výsledek:
{ "_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 } ] }
Vidíme, že zůstávají pouze recenze s hodnocením 4 a vyšším. Všechny recenze méně než 4 byly odstraněny.