MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB findOneAndDelete()

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.