In MongoDB, puoi usare $pullAll
per rimuovere tutte le istanze dei valori specificati da un array esistente.
Usa $pullAll
insieme a un metodo come update()
, updateOne()
o updateMany()
per aggiornare il/i documento/i specificato/i con la modifica.
Esempio
Supponiamo di avere una collezione con i seguenti documenti:
{ "_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 ] }
E supponiamo di voler rimuovere tutti i valori di 7
dall'array nel documento 1.
Possiamo farlo:
db.foo.update(
{ _id: 1 },
{ $pullAll: { bar: [ 7 ] } }
)
Uscita:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Quel messaggio ci dice che un documento corrispondeva e uno (cioè lo stesso documento) è stato modificato.
Diamo un'occhiata alla collezione ora:
db.foo.find()
Risultato:
{ "_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 ] }
Possiamo vedere che l'array nel documento 1 ha avuto tutto il suo 7
valori rimossi come specificato.
Rimuovi più valori
L'argomento che abbiamo fornito a $pullAll
è un array, quindi possiamo rimuovere più valori separandoli con una virgola.
Esempio:
db.foo.update(
{ _id: 2 },
{ $pullAll: { bar: [ 17, 18 ] } }
)
Uscita:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Ora controlliamo di nuovo la collezione:
db.foo.find()
Risultato:
{ "_id" : 1, "bar" : [ 1, 2, 3, 8, 1 ] } { "_id" : 2, "bar" : [ 0, 1, 8, 8 ] } { "_id" : 3, "bar" : [ 15, 11, 8, 0, 1, 3 ] }
Possiamo vedere che i valori 17
e 18
sono stati rimossi dall'array nel documento 2.
Aggiorna tutti i documenti
Puoi aggiungere multi: true
oppure usa updateMany()
metodo per aggiornare tutti i documenti che soddisfano i criteri.
Quando si esegue questa operazione, rimuovere tutti i criteri di selezione dal primo documento di query (che specifica quale/i documento/i aggiornare). In altre parole, usa un documento vuoto come primo argomento per update()
(o updateMany()
) metodo.
Esempio:
db.foo.update(
{ },
{ $pullAll: { bar: [ 1, 8 ] } },
{ multi: true }
)
Uscita:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
In questo caso, possiamo vedere che tre documenti corrispondono (perché ci sono tre documenti nella raccolta) e tutti e tre sono stati modificati (perché contenevano tutti i valori specificati).
Controlliamo di nuovo la collezione:
db.foo.find()
Risultato:
{ "_id" : 1, "bar" : [ 2, 3 ] } { "_id" : 2, "bar" : [ 0 ] } { "_id" : 3, "bar" : [ 15, 11, 0, 3 ] }
Possiamo vedere che tutte le istanze sono state aggiornate come specificato.