В MongoDB можете да използвате $pull оператор за премахване на стойности от масив.
Използвайте $pull във връзка с метод като update() за да актуализирате посочения документ с промяната.
Пример
Да предположим, че имаме колекция, наречена products със следните документи:
{ "_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" ] } Можем да премахнем елемент от масива в документ 1 по следния начин:
db.products.update(
{ _id: 1 },
{ $pull: { sizes: "XXL" } }
) Изход:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) Това съобщение ни казва, че един документ съответства и един (т.е. същият документ) е променен.
Нека да разгледаме колекцията сега:
db.products.find() Резултат:
{ "_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" ] }
Можем да видим, че масивът в документ 1 е имал своята стойност XXL премахнато, както е посочено.
Премахване на множество стойности
Можем да използваме $in оператор, за да посочим множество стойности, които искаме да премахнем от масива.
Пример:
db.products.update(
{ _id: 3 },
{ $pull: { sizes: { $in: ["XS", "XL"] } } }
) Изход:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) Сега нека проверим колекцията отново:
db.products.find() Резултат:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] }
{ "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] } Можем да видим, че двата посочени елемента са премахнати от масива в документ 3.
Актуализиране на всички документи
Можете да добавите multi: true или използвайте updateMany() метод за актуализиране на всички документи, които отговарят на критериите.
Когато направите това, премахнете всички критерии за избор от първия документ за заявка (който указва кой/ите документ/и да актуализирате). С други думи, използвайте празен документ като първи аргумент за update() (или updateMany() ) метод.
Пример:
db.products.update(
{ },
{ $pull: { sizes: "XL" } },
{ multi: true }
) Изход:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
В този случай можем да видим, че три документа съвпадат (тъй като в колекцията има три документа), но само два са променени (защото само два имат стойността XL в sizes масив).
И проверете отново колекцията:
db.products.find() Резултат:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M" ] }
{ "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L" ] }
{ "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }
Можем да видим, че всички екземпляри на XL са премахнати от всички документи в колекцията.
Масив от документи
Ако имате масив, който съдържа документи като техни елементи, можете да премахнете всеки от тези документи, като посочите критерии, които съответстват на данните в документа.
Да предположим, че имаме колекция, наречена ресторанти, която документира следните документи:
{
"_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
}
]
}
В този случай полето, наречено reviews съдържа масив от документи. Всеки документ е различен преглед на въпросния ресторант.
Можем да използваме $pull за да премахнете отзиви, които отговарят на определен критерий.
Пример:
db.restaurants.update(
{ },
{ $pull: { reviews: { rating: { $lt: 4 } } } },
{ multi: true }
) Изход:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
Това съобщение ни казва, че три документа отговарят на критериите за заявка (тъй като избрахме всички документи) и два документа бяха променени (защото два съответстваха на нашия $pull) критерии).
Нека отново проверим колекцията, за да видим ефекта:
db.restaurants.find().pretty() Резултат:
{ "_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
}
]
} Виждаме, че остават само рецензии с оценка от 4 и повече. Всички рецензии по-малко от 4 бяха премахнати.