MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB $ pull

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Разделете низ в масив от поднизове или знаци в MongoDB

  2. MongoDB Дублиращи се документи дори след добавяне на уникален ключ

  3. Най-добрата практика на MongoDB за препращане

  4. Защо грешката mongod е мъртва, но подсистемата е заключена и недостатъчно свободно място за файлове на дневници в Linux?

  5. Почивка на данните за стартиране на Spring Boot, ограничението @Notnull не работи