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

MongoDB findOneAndUpdate()

En MongoDB el db.collection.findOneAndUpdate() El método actualiza un solo documento basado en el filter y sort criterios.

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.findOneAndUpdate() método para actualizar uno de esos documentos.

db.pets.findOneAndUpdate(
    { "type": "Dog" },
    { $set: { "type": "Cow" } }
)

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" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Podemos ver que el primer documento ahora contiene una vaca en lugar de un perro.

Devolver el Documento Modificado

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

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.findOneAndUpdate(
    { "type": "Dog" },
    { $set: { "type": "Horse" } },
    { returnNewDocument: true }
)

Resultado:

{ "_id" : 2, "name" : "Bark", "type" : "Horse" }

Esta vez el otro perro fue actualizado. En este caso, lo cambiamos a un caballo, y podemos ver que el documento de devolución refleja esto.

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.findOneAndUpdate(
    { "_id": 4 },
    { $set: { "name": "Barry", "type": "Badger" } },
    { 
        returnNewDocument: true 
    }
)

Resultado:

null

El documento no existía en la colección, por lo que findOneAndUpdate() devolvió null . Aunque no especificamos 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, "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
{ "_id" : 3, "name" : "Scratch", "type" : "Cat" }

Ejemplo usando upsert: true

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

db.pets.findOneAndUpdate(
    { "_id": 4 },
    { $set: { "name": "Barry", "type": "Badger" } },
    { 
        upsert: true,
        returnNewDocument: true 
    }
)

Resultado:

{ "_id" : 4, "name" : "Barry", "type" : "Badger" }

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" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
{ "_id" : 4, "name" : "Barry", "type" : "Badger" }

Entonces podemos ver que el nuevo documento fue alterado.

Los arrayFilters Parámetro

Cuando trabaje con arreglos, puede usar los arrayFilters parámetro junto con el posicional $ operador para determinar qué elementos de la matriz actualizar. Esto le permite actualizar un elemento de matriz en función de su valor, incluso si no conoce su posición.

Por ejemplo, supongamos que tenemos una colección llamada players con los siguientes documentos:

{ "_id" : 1, "scores" : [ 1, 5, 3 ] }
{ "_id" : 2, "scores" : [ 8, 17, 18 ] }
{ "_id" : 3, "scores" : [ 15, 11, 8 ] }

Podríamos ejecutar la siguiente consulta para actualizar solo aquellos elementos de la matriz que tengan un valor superior a cierta cantidad (en este caso, 10).

db.players.findOneAndUpdate(
   { scores: { $gte: 10 } },
   { $set: { "scores.$[e]" : 10 } },
   {
       arrayFilters: [ { "e": { $gte: 10 } } ]
    }
)

Resultado:

{ "_id" : 2, "scores" : [ 8, 17, 18 ] }

Esto muestra el documento antes de que fuera actualizado. Como era de esperar, esto solo actualiza un documento, aunque dos documentos coincidan con los criterios.

Así es como se ven los documentos ahora.

db.players.find()

Resultado:

{ "_id" : 1, "scores" : [ 1, 5, 3 ] }
{ "_id" : 2, "scores" : [ 8, 10, 10 ] }
{ "_id" : 3, "scores" : [ 15, 11, 8 ] }

El documento 2 tenía dos elementos de matriz actualizados, porque esos elementos coincidían con los criterios.

Más información

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

Consulte la documentación de MongoDB para db.collections.findOneAndUpdate() para más información.