sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB $pull

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.


  1. Proč používat Redis místo MongoDb pro ukládání do mezipaměti?

  2. Mongodb – Chyba Mongoimport neplatný znak

  3. Jak najít dotazy, které nepoužívají indexy nebo jsou pomalé v mongodb

  4. Python a MongoDB:Připojení k NoSQL databázím