In MongoDB, puoi usare $pull
per rimuovere i valori da un array.
Usa $pull
insieme a un metodo come update()
per aggiornare il documento specificato con la modifica.
Esempio
Supponiamo di avere una collezione chiamata products
con i seguenti documenti:
{ "_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" ] }
Possiamo rimuovere un elemento dall'array nel documento 1 in questo modo:
db.products.update(
{ _id: 1 },
{ $pull: { sizes: "XXL" } }
)
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.products.find()
Risultato:
{ "_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" ] }
Possiamo vedere che l'array nel documento 1 ha avuto il suo valore XXL
rimosso come specificato.
Rimuovi più valori
Possiamo usare il $in
per specificare più valori che vogliamo rimuovere dall'array.
Esempio:
db.products.update(
{ _id: 3 },
{ $pull: { sizes: { $in: ["XS", "XL"] } } }
)
Uscita:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Ora controlliamo di nuovo la collezione:
db.products.find()
Risultato:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }
Possiamo vedere che i due elementi specificati sono stati rimossi dall'array nel documento 3.
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.products.update(
{ },
{ $pull: { sizes: "XL" } },
{ multi: true }
)
Uscita:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
In questo caso, possiamo vedere che tre documenti corrispondevano (perché nella collezione ci sono tre documenti), ma solo due sono stati modificati (perché solo due avevano il valore XL
nelle sizes
matrice).
E ricontrolla la collezione:
db.products.find()
Risultato:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }
Possiamo vedere che tutte le istanze di XL
sono stati rimossi da tutti i documenti della raccolta.
Matrice di documenti
Se hai una matrice che contiene documenti come elementi, puoi rimuovere uno qualsiasi di questi documenti specificando criteri che corrispondono ai dati all'interno del documento.
Supponiamo di avere una collezione chiamata ristoranti che documenta:
{ "_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 } ] }
In questo caso, il campo chiamato reviews
contiene una serie di documenti. Ogni documento è una recensione diversa del ristorante in questione.
Potremmo usare $pull
per rimuovere le recensioni che soddisfano determinati criteri.
Esempio:
db.restaurants.update(
{ },
{ $pull: { reviews: { rating: { $lt: 4 } } } },
{ multi: true }
)
Uscita:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
Questo messaggio ci dice che tre documenti corrispondevano ai criteri di ricerca (perché abbiamo selezionato tutti i documenti) e due documenti sono stati modificati (perché due corrispondevano al nostro $pull
criteri).
Controlliamo di nuovo la collezione per vedere l'effetto:
db.restaurants.find().pretty()
Risultato:
{ "_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 } ] }
Possiamo vedere che rimangono solo le recensioni con una valutazione di 4 e oltre. Tutte le recensioni inferiori a 4 sono state rimosse.