sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB findOneAndDelete()

En MongoDB el db.collection.findOneAndDelete() El método elimina un solo documento y devuelve el documento eliminado.

Elimina el primer documento coincidente en la colección que coincida con el filter . El sort El parámetro se puede utilizar para influir en qué documento se elimina.

La collection part es el nombre de la colección de la que se va a eliminar el documento.

Ejemplo

Supongamos que tenemos una colección llamada pets que contiene los siguientes documentos:

{ "_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" ] }

Podemos usar db.collection.findOneAndDelete() método para eliminar uno de esos documentos.

db.pets.findOneAndDelete(
   { "type": "Cat" }
)

Resultado:

{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

En este caso, utilicé una consulta para restringirla a solo gatos. Solo se eliminó un gato, aunque hay dos gatos en la colección.

Revisemos la colección.

db.pets.find()

Resultado:

{ "_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" ] }

Podemos ver que el primer gato (documento 3) ha sido eliminado.

Documentos incrustados

Si tiene documentos que contienen documentos incrustados, puede usar los siguientes métodos para consultar datos en los documentos incrustados.

  • Notación de puntos (p. ej., field.nestedfield: <value> )
  • Forma anidada (por ejemplo, { field: { nestedfield: <value> } } ). Tenga en cuenta que esta opción solo está disponible desde MongoDB 4.4.

Aquí hay un ejemplo que usa la notación de puntos para consultar dentro del documento incrustado.

db.pets.findOneAndDelete({ "specs.height": 400 })

Resultado:

{
	"_id" : 6,
	"name" : "Fetch",
	"type" : "Dog",
	"specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
}

Como era de esperar, el documento 6 fue eliminado.

La siguiente consulta elimina el mismo documento, pero en este caso usa un formulario anidado para referirse al documento incrustado.

db.pets.findOneAndDelete({ 
    "specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
 })

Cuando se utiliza el formulario anidado, la consulta debe coincidir exactamente con todo el documento incrustado. Por ejemplo, la siguiente consulta no coincide:

db.pets.findOneAndDelete({ 
    "specs" : {
		"height" : 400
	}
 })

Resultado:

null

Arreglos

Puede hacer referencia a datos en matrices haciendo referencia al elemento de la matriz por su índice o por su valor.

Si quisiéramos eliminar todos los perros con el premio Top Dog, podríamos escribir la siguiente consulta (que devolverá el perro anterior).

db.pets.findOneAndDelete({ 
    "awards": "Top Dog"
})

Resultado:

{
	"_id" : 7,
	"name" : "Jake",
	"type" : "Dog",
	"awards" : [
		"Top Dog",
		"Best Dog",
		"Biggest Dog"
	]
}

También puede especificar el índice del elemento, así:

db.pets.findOneAndDelete({ 
    "awards.0": "Top Dog"
})

Hacer eso requiere que el valor especificado esté en el índice especificado. Por lo tanto, la siguiente consulta no devuelve el mismo perro.

db.pets.findOneAndDelete({ 
    "awards.1": "Top Dog"
})

Tenga en cuenta que las matrices se basan en cero, por lo que un índice de 0 especifica el primer elemento, 1 especifica el segundo elemento, y así sucesivamente.

El sort Parámetro

Puedes usar el sort parámetro para especificar un orden de clasificación para los documentos que coinciden con el filter . Esto influirá en qué documento se elimina.

Al usar el sort parámetro, un valor de 1 clasifica los documentos en orden ascendente y un valor de -1 los clasifica en orden descendente.

El argumento debe proporcionarse como un documento. Por ejemplo, { sort: { "salary": 1 } } ordena por el salary campo en orden ascendente.

Por ejemplo, supongamos que creamos una colección llamada employees con los siguientes documentos:

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 }
    ])

Podríamos ejecutar el siguiente código para buscar documentos con un salario inferior a 60 000 y luego eliminar el que sea más bajo de esos documentos.

db.employees.findOneAndDelete(
   { "salary": { $lt: 60000 } },
   {
       sort: { "salary": 1 }
    }
)

Resultado:

{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }

Como era de esperar, se eliminó al empleado con el salario más bajo.

Así es como se ven los documentos ahora.

db.employees.find()

Resultado:

{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Entonces podemos ver que Fritz ha sido eliminado.

Regresemos al documento original.

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 }
    ])

Ahora ejecutemos el mismo findOneAndDelete() código de nuevo, pero esta vez lo ordenaremos en orden descendente.

db.employees.findOneAndDelete(
   { "salary": { $lt: 60000 } },
   {
       sort: { "salary": -1 }
    }
)

Resultado:

{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }

Esta vez Sandy fue eliminada.

Revisemos la colección nuevamente.

db.employees.find()

Resultado:

{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Como era de esperar, Sandy ya no está en la colección.

Más información

db.collection.findOneAndDelete() El método también acepta otros parámetros, como projection (para especificar un subconjunto de campos para devolver), maxTimeMS y collection .

Consulte la documentación de MongoDB para obtener más información.