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.