sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $pull

I MongoDB kan du använda $pull operator för att ta bort värden från en matris.

Använd $pull i kombination med en metod som update() för att uppdatera det angivna dokumentet med ändringen.

Exempel

Anta att vi har en samling som heter products med följande dokument:

{ "_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" ] }

Vi kan ta bort ett element från arrayen i dokument 1 så här:

db.products.update( 
  { _id: 1 }, 
  { $pull: { sizes: "XXL" } } 
)

Utdata:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Det meddelandet talar om för oss att ett dokument matchade och ett (dvs samma dokument) har ändrats.

Låt oss ta en titt på kollektionen nu:

db.products.find()

Resultat:

{ "_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" ] }

Vi kan se att arrayen i dokument 1 har haft sitt värde XXL tagits bort som specificerat.

Ta bort flera värden

Vi kan använda $in operatorn för att ange flera värden som vi vill ta bort från arrayen.

Exempel:

db.products.update( 
  { _id: 3 }, 
  { $pull: { sizes: { $in: ["XS", "XL"] } } } 
)

Utdata:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Låt oss nu kontrollera samlingen igen:

db.products.find()

Resultat:

{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] }
{ "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] }
{ "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }

Vi kan se att de två specificerade elementen har tagits bort från arrayen i dokument 3.

Uppdatera alla dokument

Du kan lägga till multi: true eller använd updateMany() metod för att uppdatera alla dokument som matchar kriterierna.

När du gör detta, ta bort eventuella urvalskriterier från det första frågedokumentet (som anger vilka dokument som ska uppdateras). Med andra ord, använd ett tomt dokument som det första argumentet till update() (eller updateMany() ) metod.

Exempel:

db.products.update( 
  { }, 
  { $pull: { sizes: "XL" } },
  { multi: true }
)

Utdata:

WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })

I det här fallet kan vi se att tre dokument matchade (eftersom det finns tre dokument i samlingen), men endast två modifierades (eftersom endast två hade värdet XL i sizes array).

Och kontrollera samlingen igen:

db.products.find()

Resultat:

{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M" ] }
{ "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L" ] }
{ "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }

Vi kan se att alla instanser av XL har tagits bort från alla dokument i samlingen.

Array av dokument

Om du har en array som innehåller dokument som sina element, kan du ta bort något av dessa dokument genom att ange kriterier som matchar data i dokumentet.

Anta att vi har en samling som kallas restauranger som följande dokumenterar:

{
	"_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
		}
	]
}

I det här fallet, fältet som heter reviews innehåller en mängd dokument. Varje dokument är en annan recension av restaurangen i fråga.

Vi skulle kunna använda $pull för att ta bort recensioner som matchar ett visst kriterium.

Exempel:

db.restaurants.update(
  { },
  { $pull: { reviews: { rating: { $lt: 4 } } } },
  { multi: true }
)

Utdata:

WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })

Det här meddelandet talar om för oss att tre dokument matchade frågekriterierna (eftersom vi valde alla dokument), och två dokument har ändrats (eftersom två matchade vår $pull kriterier).

Låt oss kolla in samlingen igen för att se effekten:

db.restaurants.find().pretty()

Resultat:

{ "_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
		}
	]
}

Vi kan se att endast recensioner med betyget 4 och högre finns kvar. Alla recensioner färre än 4 har tagits bort.


  1. MongoDB - Skapa ett dokument

  2. Konvertera ett mongo lagrat datum tillbaka till millisekunder sedan Unix-epoken när det laddades?

  3. MongoDB insertMany()

  4. Hur tillämpar man begränsningar i MongoDB?