В 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 бяха премахнати.