V MongoDB můžete použít $pullAll
operátor k odstranění všech instancí zadaných hodnot z existujícího pole.
Použijte $pullAll
ve spojení s metodou, jako je update()
, updateOne()
nebo updateMany()
aktualizovat specifikovaný dokument/y se změnou.
Příklad
Předpokládejme, že máme sbírku s následujícími dokumenty:
{ "_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 ] }
A řekněme, že chceme odstranit všechny hodnoty 7
z pole v dokumentu 1.
Můžeme to udělat:
db.foo.update(
{ _id: 1 },
{ $pullAll: { bar: [ 7 ] } }
)
Výstup:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Tato zpráva nám říká, že jeden dokument se shodoval a jeden (tj. stejný dokument) byl upraven.
Pojďme se nyní podívat na kolekci:
db.foo.find()
Výsledek:
{ "_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 ] }
Můžeme vidět, že pole v dokumentu 1 má všech svých 7
hodnoty odstraněny, jak je uvedeno.
Odebrat více hodnot
Argument, který jsme poskytli $pullAll
je pole, a proto můžeme odstranit více hodnot tak, že je oddělíme čárkou.
Příklad:
db.foo.update(
{ _id: 2 },
{ $pullAll: { bar: [ 17, 18 ] } }
)
Výstup:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Nyní znovu zkontrolujeme sbírku:
db.foo.find()
Výsledek:
{ "_id" : 1, "bar" : [ 1, 2, 3, 8, 1 ] } { "_id" : 2, "bar" : [ 0, 1, 8, 8 ] } { "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }
Vidíme, že hodnoty 17
a 18
byly odstraněny z pole v dokumentu 2.
Aktualizovat všechny dokumenty
Můžete přidat multi: true
nebo použijte updateMany()
metoda k aktualizaci všech dokumentů, které odpovídají kritériím.
Když to uděláte, odeberte všechna kritéria výběru z prvního dokumentu dotazu (který určuje, které dokumenty se mají aktualizovat). Jinými slovy, použijte prázdný dokument jako první argument update()
(nebo updateMany()
) metoda.
Příklad:
db.foo.update(
{ },
{ $pullAll: { bar: [ 1, 8 ] } },
{ multi: true }
)
Výstup:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
V tomto případě vidíme, že se tři dokumenty shodovaly (protože ve sbírce jsou tři dokumenty) a všechny tři byly upraveny (protože všechny obsahovaly zadané hodnoty).
Podívejme se znovu na sbírku:
db.foo.find()
Výsledek:
{ "_id" : 1, "bar" : [ 2, 3 ] } { "_id" : 2, "bar" : [ 0 ] } { "_id" : 3, "bar" : [ 15, 11, 0, 3 ] }
Vidíme, že všechny instance byly aktualizovány, jak je uvedeno.