I MongoDB kan du bruge $pullAll
operator for at fjerne alle forekomster af de angivne værdier fra et eksisterende array.
Brug $pullAll
i forbindelse med en metode såsom update()
, updateOne()
, eller updateMany()
for at opdatere det eller de angivne dokumenter med ændringen.
Eksempel
Antag, at vi har en samling med følgende dokumenter:
{ "_id" : 1, "bar" : [ 1, 7, 2, 3, 8, 7, 1 ] } { "_id" : 2, "bar" : [ 0, 1, 8, 17, 18, 8 ] } { "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }
Og lad os sige, at vi vil fjerne alle værdier af 7
fra arrayet i dokument 1.
Vi kan gøre dette:
db.foo.update(
{ _id: 1 },
{ $pullAll: { bar: [ 7 ] } }
)
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.foo.find()
Resultat:
{ "_id" : 1, "bar" : [ 1, 2, 3, 8, 1 ] } { "_id" : 2, "bar" : [ 0, 1, 8, 17, 18, 8 ] } { "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }
Vi kan se, at arrayet i dokument 1 har haft alle sine 7
værdier fjernet som angivet.
Fjern flere værdier
Argumentet, vi gav til $pullAll
er en matrix, og vi kan derfor fjerne flere værdier ved at adskille dem med et komma.
Eksempel:
db.foo.update(
{ _id: 2 },
{ $pullAll: { bar: [ 17, 18 ] } }
)
Output:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Lad os nu tjekke samlingen igen:
db.foo.find()
Resultat:
{ "_id" : 1, "bar" : [ 1, 2, 3, 8, 1 ] } { "_id" : 2, "bar" : [ 0, 1, 8, 8 ] } { "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }
Vi kan se, at værdierne 17
og 18
er blevet fjernet fra arrayet i dokument 2.
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.foo.update(
{ },
{ $pullAll: { bar: [ 1, 8 ] } },
{ multi: true }
)
Output:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
I dette tilfælde kan vi se, at tre dokumenter matchede (fordi der er tre dokumenter i samlingen), og alle tre blev ændret (fordi de alle indeholdt de angivne værdier).
Lad os tjekke samlingen igen:
db.foo.find()
Resultat:
{ "_id" : 1, "bar" : [ 2, 3 ] } { "_id" : 2, "bar" : [ 0 ] } { "_id" : 3, "bar" : [ 15, 11, 0, 3 ] }
Vi kan se, at alle forekomster er blevet opdateret som angivet.