I MongoDB kan du använda $pull
operator för att ta bort värden från en matris.
Använd $pull
i kombination med en metod som update()
för att uppdatera det angivna dokumentet med ändringen.
Exempel
Anta att vi har en samling som heter products
med följande dokument:
{ "_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 ta bort ett element från arrayen i dokument 1 så här:
db.products.update(
{ _id: 1 },
{ $pull: { sizes: "XXL" } }
)
Utdata:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Det meddelandet talar om för oss att ett dokument matchade och ett (dvs samma dokument) har ändrats.
Låt oss ta en titt 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 att arrayen i dokument 1 har haft sitt värde XXL
tagits bort som specificerat.
Ta bort flera värden
Vi kan använda $in
operatorn för att ange flera värden som vi vill ta bort från arrayen.
Exempel:
db.products.update(
{ _id: 3 },
{ $pull: { sizes: { $in: ["XS", "XL"] } } }
)
Utdata:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Låt oss nu kontrollera 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 att de två specificerade elementen har tagits bort från arrayen i dokument 3.
Uppdatera alla dokument
Du kan lägga till multi: true
eller använd updateMany()
metod för att uppdatera alla dokument som matchar kriterierna.
När du gör detta, ta bort eventuella urvalskriterier från det första frågedokumentet (som anger vilka dokument som ska uppdateras). Med andra ord, använd ett tomt dokument som det första argumentet till update()
(eller updateMany()
) metod.
Exempel:
db.products.update(
{ },
{ $pull: { sizes: "XL" } },
{ multi: true }
)
Utdata:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
I det här fallet kan vi se att tre dokument matchade (eftersom det finns tre dokument i samlingen), men endast två modifierades (eftersom endast två hade värdet XL
i sizes
array).
Och kontrollera 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 att alla instanser av XL
har tagits bort från alla dokument i samlingen.
Array av dokument
Om du har en array som innehåller dokument som sina element, kan du ta bort något av dessa dokument genom att ange kriterier som matchar data i dokumentet.
Anta att vi har en samling som kallas restauranger som följande dokumenterar:
{ "_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 det här fallet, fältet som heter reviews
innehåller en mängd dokument. Varje dokument är en annan recension av restaurangen i fråga.
Vi skulle kunna använda $pull
för att ta bort recensioner som matchar ett visst kriterium.
Exempel:
db.restaurants.update(
{ },
{ $pull: { reviews: { rating: { $lt: 4 } } } },
{ multi: true }
)
Utdata:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
Det här meddelandet talar om för oss att tre dokument matchade frågekriterierna (eftersom vi valde alla dokument), och två dokument har ändrats (eftersom två matchade vår $pull
kriterier).
Låt oss kolla in samlingen igen för att 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 att endast recensioner med betyget 4 och högre finns kvar. Alla recensioner färre än 4 har tagits bort.