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.