sql >> Database >  >> NoSQL >> MongoDB

MongoDB $pull

In MongoDB kunt u de $pull . gebruiken operator om waarden uit een array te verwijderen.

Gebruik $pull in combinatie met een methode zoals update() om het opgegeven document met de wijziging bij te werken.

Voorbeeld

Stel dat we een verzameling hebben met de naam products met de volgende documenten:

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

We kunnen een element als volgt uit de array in document 1 verwijderen:

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

Uitgang:

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

Dat bericht vertelt ons dat één document overeenkomt en één (d.w.z. hetzelfde document) is gewijzigd.

Laten we de collectie nu eens bekijken:

db.products.find()

Resultaat:

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

We kunnen zien dat de array in document 1 de waarde XXL . heeft gehad verwijderd zoals gespecificeerd.

Verwijder meerdere waarden

We kunnen de $in . gebruiken operator om meerdere waarden op te geven die we uit de array willen verwijderen.

Voorbeeld:

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

Uitgang:

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

Laten we nu de collectie nog eens bekijken:

db.products.find()

Resultaat:

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

We kunnen zien dat de twee gespecificeerde elementen zijn verwijderd uit de array in document 3.

Alle documenten bijwerken

U kunt multi: true . toevoegen of gebruik de updateMany() methode om alle documenten bij te werken die aan de criteria voldoen.

Wanneer u dit doet, verwijdert u alle selectiecriteria uit het eerste querydocument (dat specificeert welke documenten moeten worden bijgewerkt). Met andere woorden, gebruik een leeg document als het eerste argument voor de update() (of updateMany() ) methode.

Voorbeeld:

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

Uitgang:

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

In dit geval kunnen we zien dat drie documenten overeenkwamen (omdat er drie documenten in de collectie zijn), maar slechts twee werden gewijzigd (omdat slechts twee de waarde XL hadden in de sizes reeks).

En controleer de collectie opnieuw:

db.products.find()

Resultaat:

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

We kunnen zien dat alle exemplaren van XL zijn verwijderd uit alle documenten in de collectie.

Array van documenten

Als u een array heeft die documenten als elementen bevat, kunt u elk van die documenten verwijderen door criteria op te geven die overeenkomen met gegevens in het document.

Stel dat we een verzameling restaurants hebben die de volgende documenten bevat:

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

In dit geval is het veld met de naam reviews bevat een reeks documenten. Elk document is een andere recensie van het betreffende restaurant.

We zouden $pull . kunnen gebruiken om reviews te verwijderen die aan bepaalde criteria voldoen.

Voorbeeld:

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

Uitgang:

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

Dit bericht vertelt ons dat drie documenten voldeden aan de zoekcriteria (omdat we alle documenten hadden geselecteerd), en dat twee documenten werden gewijzigd (omdat twee overeenkwamen met onze $pull criteria).

Laten we de collectie nog eens bekijken om het effect te zien:

db.restaurants.find().pretty()

Resultaat:

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

We kunnen zien dat alleen beoordelingen met een beoordeling van 4 en hoger overblijven. Alle beoordelingen minder dan 4 zijn verwijderd.


  1. Kan geen index maken in mongodb, sleutel te groot om te indexeren

  2. Apache Phoenix voor CDH

  3. Combineer twee OR-query's met AND in Mongoose

  4. Maak een back-up van een MongoDB-database met mongodump