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.