I MongoDB kan du bruge $pull
operator for at fjerne værdier fra et array.
Brug $pull
i forbindelse med en metode såsom update()
for at opdatere det angivne dokument med ændringen.
Eksempel
Antag, at vi har en samling kaldet products
med følgende dokumenter:
{ "_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 fjerne et element fra arrayet i dokument 1 på denne måde:
db.products.update(
{ _id: 1 },
{ $pull: { sizes: "XXL" } }
)
Output:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Den meddelelse fortæller os, at et dokument matchede, og et (dvs. det samme dokument) blev ændret.
Lad os tage et kig 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, at arrayet i dokument 1 har haft sin værdi XXL
fjernet som angivet.
Fjern flere værdier
Vi kan bruge $in
operator for at angive flere værdier, som vi ønsker at fjerne fra arrayet.
Eksempel:
db.products.update(
{ _id: 3 },
{ $pull: { sizes: { $in: ["XS", "XL"] } } }
)
Output:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Lad os nu tjekke 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, at de to specificerede elementer er blevet fjernet fra arrayet i dokument 3.
Opdater alle dokumenter
Du kan tilføje multi: true
eller brug updateMany()
metode til at opdatere alle dokumenter, der matcher kriterierne.
Når du gør dette, skal du fjerne eventuelle udvælgelseskriterier fra det første forespørgselsdokument (der angiver, hvilke dokumenter der skal opdateres). Med andre ord, brug et tomt dokument som det første argument til update()
(eller updateMany()
) metode.
Eksempel:
db.products.update(
{ },
{ $pull: { sizes: "XL" } },
{ multi: true }
)
Output:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
I dette tilfælde kan vi se, at tre dokumenter matchede (fordi der er tre dokumenter i samlingen), men kun to blev ændret (fordi kun to havde værdien XL
i sizes
array).
Og tjek 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, at alle forekomster af XL
er blevet fjernet fra alle dokumenter i samlingen.
Vifte af dokumenter
Hvis du har et array, der indeholder dokumenter som deres elementer, kan du fjerne et hvilket som helst af disse dokumenter ved at angive kriterier, der matcher data i dokumentet.
Antag, at vi har en samling kaldet restauranter, som følgende dokumenterer:
{ "_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 dette tilfælde er feltet kaldet reviews
indeholder en række dokumenter. Hvert dokument er en anden anmeldelse af den pågældende restaurant.
Vi kunne bruge $pull
for at fjerne anmeldelser, der matcher et bestemt kriterium.
Eksempel:
db.restaurants.update(
{ },
{ $pull: { reviews: { rating: { $lt: 4 } } } },
{ multi: true }
)
Output:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
Denne meddelelse fortæller os, at tre dokumenter matchede forespørgselskriterierne (fordi vi valgte alle dokumenter), og to dokumenter blev ændret (fordi to matchede vores $pull
kriterier).
Lad os tjekke samlingen igen for at 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, at kun anmeldelser med en vurdering på 4 og derover er tilbage. Alle anmeldelser mindre end 4 er blevet fjernet.