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.