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

MongoDB findOneAndReplace()

En MongoDB el db.collection.findOneAndReplace() El método reemplaza un solo documento basado en el filtro especificado.

La collection part es el nombre de la colección con la que realizar la operación.

Ejemplo

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

{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Podemos usar db.collection.findOneAndReplace() método para reemplazar uno de esos documentos.

db.pets.findOneAndReplace(
   { "type": "Dog" },
   { "name": "Bruno", "type" : "Horse" }
)

Resultado:

{ "_id" : 1, "name" : "Wag", "type" : "Dog" }

Por defecto, devuelve el documento original (no la versión modificada).

Tenga en cuenta que solo se actualizó un perro, aunque hay dos perros en la colección.

Revisemos la colección.

db.pets.find()

Resultado:

{ "_id" : 1, "name" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Podemos ver que el primer documento ha sido reemplazado por el nuevo documento.

Tenga en cuenta que el documento de reemplazo no puede especificar un _id valor que difiere del _id valor en el documento reemplazado.

Devolver el Documento Modificado

De forma predeterminada, el documento original se devuelve cuando usa db.collection.findOneAndReplace() .

Si prefiere que se le devuelva el documento modificado, use el returnNewDocument parámetro.

Hagamos otra modificación, pero esta vez usaremos returnNewDocument: true .

db.pets.findOneAndReplace(
   { "type": "Dog" },
   { "handle": "Harry", "DOB" : "2020-05-12", "points": 10 },
   { returnNewDocument: true }
)

Resultado:

{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }

Esta vez el otro perro fue actualizado. En este caso, hicimos un cambio más significativo y podemos ver que el documento de devolución lo refleja.

Podemos revisar la colección nuevamente para ver el documento reemplazado.

db.pets.find()

Resultado:

{ "_id" : 1, "name" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Inserciones

Un upsert es una opción que puede usar en las operaciones de actualización. Si el documento especificado no existe, se inserta uno nuevo. Si lo hace existe, el documento original se actualiza (y no se inserta ningún documento).

Puede realizar upserts especificando upsert: true .

Ejemplo usando upsert: false

Primero, aquí hay un ejemplo de intentar actualizar un documento inexistente cuando upsert: false .

db.pets.findOneAndReplace(
   { "_id": 4 },
   { "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
   {
       returnNewDocument: true
    }
)

Resultado:

null

El documento no existía en la colección, por lo que findOneAndReplace() devolvió null . Aunque no especificamos explícitamente upsert: false , sabemos que era falso porque ese es el valor predeterminado (es decir, ese es el valor que se usa cuando no especifica una opción upsert).

Si echamos otro vistazo a la colección, podemos ver que el documento no fue alterado.

db.pets.find()

Resultado:

{ "_id" : 1, "name" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Ejemplo usando upsert: true

Ahora aquí está de nuevo, pero esta vez especificamos upsert: true .

db.pets.findOneAndReplace(
   { "_id": 4 },
   { "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
   {
       upsert: true,
       returnNewDocument: true
    }
)

Resultado:

{
	"_id" : 4,
	"name" : "Fluffy",
	"type" : "Pooch",
	"DOB" : "2019-12-03",
	"points" : 20
}

Esta vez se altera un nuevo documento y vemos el documento alterado como la salida (porque especificamos returnNewDocument: true ).

Revisemos la colección nuevamente.

db.pets.find()

Resultado:

{ "_id" : 1, "name" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
{ "_id" : 4, "name" : "Fluffy", "type" : "Pooch", "DOB" : "2019-12-03", "points" : 20 }

Entonces podemos ver que el nuevo documento fue alterado.

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 .

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 reemplazar el que sea más bajo de esos documentos.

db.employees.findOneAndReplace(
   { "salary": { $lt: 60000 } },
   { "name": "Fluffy", "salary": 250000 },
   {
       sort: { "salary": 1 }
    }
)

Resultado:

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

Esto muestra el documento antes de que fuera actualizado. Como era de esperar, el empleado con el salario más bajo fue reemplazado con un nuevo salario (y un nuevo nombre).

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" : 3, "name" : "Fluffy", "salary" : 250000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Entonces podemos ver que Fritz ha sido reemplazado por Fluffy, que tiene un salario mucho mejor.

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 findOneAndReplace() código de nuevo, pero esta vez lo ordenaremos en orden descendente.

db.employees.findOneAndReplace(
   { "salary": { $lt: 60000 } },
   { "name": "Fluffy", "salary": 250000 },
   {
       sort: { "salary": -1 }
    }
)

Resultado:

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

Esta vez Sandy fue reemplazada.

Revisemos la colección nuevamente.

db.employees.find()

Resultado:

{ "_id" : 1, "name" : "Fluffy", "salary" : 250000 }
{ "_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.

Más información

db.collection.findOneAndReplace() 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 db.collections.findOneAndReplace() para más información.