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.