MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $pull

In MongoDB können Sie den $pull verwenden Operator zum Entfernen von Werten aus einem Array.

Verwenden Sie $pull in Verbindung mit einer Methode wie update() um das angegebene Dokument mit der Änderung zu aktualisieren.

Beispiel

Angenommen, wir haben eine Sammlung namens products mit folgenden Dokumenten:

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

Wir können ein Element aus dem Array in Dokument 1 wie folgt entfernen:

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

Ausgabe:

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

Diese Nachricht teilt uns mit, dass ein Dokument übereinstimmte und eines (d. h. dasselbe Dokument) geändert wurde.

Werfen wir jetzt einen Blick auf die Sammlung:

db.products.find()

Ergebnis:

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

Wir können sehen, dass das Array in Dokument 1 seinen Wert XXL hat wie angegeben entfernt.

Mehrere Werte entfernen

Wir können den $in verwenden -Operator, um mehrere Werte anzugeben, die wir aus dem Array entfernen möchten.

Beispiel:

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

Ausgabe:

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

Lassen Sie uns nun die Sammlung erneut überprüfen:

db.products.find()

Ergebnis:

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

Wir können sehen, dass die beiden angegebenen Elemente aus dem Array in Dokument 3 entfernt wurden.

Alle Dokumente aktualisieren

Sie können multi: true hinzufügen oder verwenden Sie updateMany() Methode, um alle Dokumente zu aktualisieren, die den Kriterien entsprechen.

Entfernen Sie dabei alle Auswahlkriterien aus dem ersten Abfragedokument (das angibt, welche(s) Dokument(e) aktualisiert werden sollen). Verwenden Sie mit anderen Worten ein leeres Dokument als erstes Argument für update() (oder updateMany() )-Methode.

Beispiel:

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

Ausgabe:

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

In diesem Fall können wir sehen, dass drei Dokumente übereinstimmten (weil es drei Dokumente in der Sammlung gibt), aber nur zwei geändert wurden (weil nur zwei den Wert XL hatten in den sizes Array).

Und überprüfen Sie die Sammlung erneut:

db.products.find()

Ergebnis:

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

Wir können sehen, dass alle Instanzen von XL wurden aus allen Dokumenten in der Sammlung entfernt.

Reihe von Dokumenten

Wenn Sie ein Array haben, das Dokumente als Elemente enthält, können Sie jedes dieser Dokumente entfernen, indem Sie Kriterien angeben, die mit Daten innerhalb des Dokuments übereinstimmen.

Angenommen, wir haben eine Sammlung namens Restaurants, die die folgenden Dokumente enthält:

{
	"_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 diesem Fall das Feld namens reviews enthält eine Reihe von Dokumenten. Jedes Dokument ist eine andere Bewertung des betreffenden Restaurants.

Wir könnten $pull verwenden um Rezensionen zu entfernen, die bestimmten Kriterien entsprechen.

Beispiel:

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

Ausgabe:

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

Diese Nachricht teilt uns mit, dass drei Dokumente mit den Abfragekriterien übereinstimmten (weil wir alle Dokumente ausgewählt haben) und zwei Dokumente geändert wurden (weil zwei mit unserem $pull übereinstimmten Kriterien).

Sehen wir uns die Sammlung noch einmal an, um den Effekt zu sehen:

db.restaurants.find().pretty()

Ergebnis:

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

Wir können sehen, dass nur Bewertungen mit einer Bewertung von 4 und höher übrig bleiben. Alle Rezensionen unter 4 wurden entfernt.