In MongoDB il db.collection.findOneAndDelete()
elimina un singolo documento e restituisce il documento eliminato.
Elimina il primo documento corrispondente nella raccolta che corrisponde al filter
. Il sort
parametro può essere utilizzato per influenzare quale documento viene eliminato.
La collection
part è il nome della raccolta da cui eliminare il documento.
Esempio
Supponiamo di avere una collezione chiamata pets
che contiene i seguenti documenti:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } } { "_id" : 7, "name" : "Jake", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }
Possiamo usare db.collection.findOneAndDelete()
metodo per eliminare uno di quei documenti.
db.pets.findOneAndDelete(
{ "type": "Cat" }
)
Risultato:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
In questo caso ho usato una query per restringerla ai soli gatti. È stato eliminato solo un gatto, anche se nella raccolta sono presenti due gatti.
Controlliamo la collezione.
db.pets.find()
Risultato:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } } { "_id" : 7, "name" : "Jake", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }
Possiamo vedere che il primo gatto (documento 3) è stato cancellato.
Documenti incorporati
Se disponi di documenti che contengono documenti incorporati, puoi utilizzare i seguenti metodi per eseguire query sui dati nei documenti incorporati.
- Notazione punto (ad es.
field.nestedfield: <value>
) - Modulo nidificato (ad es. {
field: { nestedfield: <value> } }
). Nota che questa opzione è disponibile solo da MongoDB 4.4.
Ecco un esempio che utilizza la notazione del punto per eseguire query all'interno del documento incorporato.
db.pets.findOneAndDelete({ "specs.height": 400 })
Risultato:
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }
Come previsto, il documento 6 è stato eliminato.
La query seguente elimina lo stesso documento, ma in questo caso utilizza il modulo nidificato per fare riferimento al documento incorporato.
db.pets.findOneAndDelete({
"specs" : {
"height" : 400,
"weight" : 15,
"color" : "brown"
}
})
Quando si utilizza il modulo nidificato, la query deve corrispondere esattamente all'intero documento incorporato. Ad esempio, la seguente query non corrisponde:
db.pets.findOneAndDelete({
"specs" : {
"height" : 400
}
})
Risultato:
null
Array
Puoi fare riferimento ai dati negli array facendo riferimento all'elemento dell'array in base al suo indice o al suo valore.
Se volessimo eliminare tutti i cani con il premio Top Dog, potremmo scrivere la seguente query (che restituirà il cane sopra).
db.pets.findOneAndDelete({
"awards": "Top Dog"
})
Risultato:
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }
Puoi anche specificare l'indice dell'elemento, in questo modo:
db.pets.findOneAndDelete({
"awards.0": "Top Dog"
})
Ciò richiede che il valore specificato sia all'indice specificato. Pertanto, la query seguente non restituisce lo stesso cane.
db.pets.findOneAndDelete({
"awards.1": "Top Dog"
})
Si noti che gli array sono in base zero, quindi un indice di 0 specifica il primo elemento, 1 specifica il secondo elemento e così via.
Il sort
Parametro
Puoi usare il sort
parametro per specificare un ordinamento per i documenti corrispondenti al filter
. Ciò influenzerà quale documento verrà eliminato.
Quando si utilizza sort
parametro, un valore di 1
ordina i documenti in ordine crescente e un valore di -1
li ordina in ordine decrescente.
L'argomento deve essere fornito come un documento. Ad esempio, { sort: { "salary": 1 } }
ordina per salary
campo in ordine crescente.
Ad esempio, supponiamo di creare una raccolta chiamata employees
con i seguenti documenti:
db.employees.insertMany([
{ _id: 1, name: "Sandy", salary: 55000 },
{ _id: 2, name: "Sarah", salary: 128000 },
{ _id: 3, name: "Fritz", salary: 25000 },
{ _id: 4, name: "Chris", salary: 45000 },
{ _id: 5, name: "Beck", salary: 82000 }
])
Potremmo eseguire il codice seguente per trovare i documenti con uno stipendio inferiore a 60000, quindi eliminare quello che è il più basso tra quei documenti.
db.employees.findOneAndDelete(
{ "salary": { $lt: 60000 } },
{
sort: { "salary": 1 }
}
)
Risultato:
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
Come previsto, il dipendente con lo stipendio più basso è stato eliminato.
Ecco come sono ora i documenti.
db.employees.find()
Risultato:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
Quindi possiamo vedere che Fritz è stato eliminato.
Riportiamolo al documento originale.
db.employees.remove({})
db.employees.insertMany([
{ _id: 1, name: "Sandy", salary: 55000 },
{ _id: 2, name: "Sarah", salary: 128000 },
{ _id: 3, name: "Fritz", salary: 25000 },
{ _id: 4, name: "Chris", salary: 45000 },
{ _id: 5, name: "Beck", salary: 82000 }
])
Ora eseguiamo lo stesso findOneAndDelete()
codice di nuovo, ma questa volta lo ordineremo in ordine decrescente.
db.employees.findOneAndDelete(
{ "salary": { $lt: 60000 } },
{
sort: { "salary": -1 }
}
)
Risultato:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
Questa volta Sandy è stato eliminato.
Controlliamo di nuovo la collezione.
db.employees.find()
Risultato:
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
Come previsto, Sandy non è più nella collezione.
Maggiori informazioni
Il db.collection.findOneAndDelete()
il metodo accetta anche altri parametri, come projection
(per specificare un sottoinsieme di campi da restituire), maxTimeMS
e collation
.
Consulta la documentazione di MongoDB per ulteriori informazioni.