Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

db.colección.actualizar() (método mongosh)

Importante

Método obsoleto de mongosh

Este método está obsoleto en. Para métodos alternativos,mongosh consulte Cambios de compatibilidad con la consola de mongo heredada.

db.collection.update(query, update, options)

Modifica un documento o varios documentos existentes en una colección. El método puede modificar campos específicos de un documento o de documentos existentes o reemplazar por completo un documento existente, dependiendo del parámetro de actualización.

Por defecto, el db.collection.update() método actualiza un solo documento. Incluya la opción multi: true para actualizar todos los documentos que coincidan con los criterios de la consulta.

Este método está disponible en implementaciones alojadas en los siguientes entornos:

  • MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube

Nota

Este comando es compatible con todos los clústeres de MongoDB Atlas. Para obtener información sobre la compatibilidad de Atlas con todos los comandos, consulte Comandos no compatibles.

  • MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB

  • MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.

Cambiado en la versión 5.0.

El método db.collection.update() tiene la siguiente forma:

db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string>,
let: <document>,
maxTimeMS: <int>,
bypassDocumentValidation: <boolean>
}
)

El método db.collection.update() acepta los siguientes parámetros:

Parameter
Tipo
Descripción

Documento

Los criterios de selección para actualizar. Los mismos selectores query que en el método find() están disponibles.

Cuando ejecutas un update() con upsert: true y la consulta no coincide con ningún documento existente, MongoDB se negará a insertar un nuevo documento si la consulta especifica condiciones en el _id campo usando la notación de punto.

documento o pipeline

Las modificaciones que se deben aplicar puede ser una de las siguientes:

Contiene únicamente <field1>: <value1> pares.

Contiene únicamente las siguientes etapas de agregación:

Para obtener más detalles y ejemplos, consulta Entradas del Oplog.

booleano

Opcional.true update() Cuando,:

  • Crea un nuevo documento si no hay documentos que coincidan con query. Para obtener más detalles, se puede consultar comportamiento de inserción.

  • Actualiza un solo documento que coincida con query.

Si tanto upsert como multi son verdaderos y ningún documento coincide con el query, la operación de actualizar inserta solo un documento.

Para evitar múltiples inserciones, asegúrate de que los campos del query estén indexados de forma única. Se puede consultar Inserción con valores duplicados como ejemplo.

Se establece por defecto en false, lo que no inserta un nuevo documento cuando no se encuentra ninguna coincidencia.

booleano

Opcional. Si true se establece en, actualiza varios documentos que cumplen con el query criterio. Si false se establece en, actualiza un documento. El valor predeterminado false es. Para obtener más información, consulte los ejemplos de actualización de varios documentos.

Documento

Opcional. Un documento que expresa el nivel de confirmación de escritura (write concern). Omite para usar el nivel de confirmación de escritura (write concern) por defecto w: "majority".

No establezcas explícitamente el nivel de confirmación de escritura para la operación si se ejecuta en una transacción. Para usar el nivel de confirmación de escritura con transacciones, consulta Transacciones y nivel de confirmación de escritura.

Para un ejemplo usando writeConcern, se puede consultar Anular el nivel de confirmación de escritura (write concern) por defecto.

Documento

Opcional.

La intercalación permite a los usuarios especificar reglas propias del lenguaje para la comparación de strings, como reglas para el uso de mayúsculas y minúsculas y marcas de acento.

Para un ejemplo usando collation, consulta Especificar intercalación.

arreglo

Opcional. Un arreglo de documentos de filtro que determinan qué elementos del arreglo modificar para una operación de actualización en un campo de arreglo.

En el documento de actualización, utilice para definir un $[<identifier>] identificador para actualizar solo aquellos elementos de la matriz que coincidan con el documento de filtro correspondiente arrayFilters en.

No es posible tener un documento de filtro de arreglo para un identificador si el identificador no está incluido en el documento para actualizar.

Para ver ejemplos, consulte Operaciones de actualización de matrices.

Documento o string

Opcional. Un documento o cadena que especifica el índice que se utilizará para admitir el predicadode la consulta.

La opción puede tomar un documento de especificación de índice o la string de nombre de índice.

Si especifica un índice que no existe, la operación genera un error.

Para ver un ejemplo, consulte Especificar hint para operaciones de actualización.

Documento

Opcional.

Especifica un documento que contiene una lista de variables. Esto le permite mejorar la legibilidad de los comandos al separar las variables del texto de la query.

La sintaxis del documento es:

{
<variable_name_1>: <expression_1>,
...,
<variable_name_n>: <expression_n>
}

La variable se establece en el valor devuelto por la expresión y no puede modificarse posteriormente.

Para acceder al valor de una variable en el comando, se debe usar el prefijo de doble signo de dólar ($$) junto con el nombre de la variable en la forma $$<variable_name>. Por ejemplo: $$targetTotal.

Para usar una variable para los resultados del filtro, debes acceder a la variable dentro del operador $expr.

Para ver un ejemplo completo que utilice let y variables, consulte Uso de variables let en.

entero

Opcional. Especifica el límite de tiempo en milisegundos para que la operación de actualización se ejecute antes de que se agote el tiempo de espera.

booleano

Opcional. Permite que insert omita la validación de esquema durante la operación. Esto permite insertar documentos que no cumplen con los requisitos de validación.

El método devuelve un documento WriteResult que contiene el estado de la operación.

En las implementaciones que se ejecutan con authorization, el usuario debe tener acceso que incluya los siguientes privilegios:

  • update acción en las colecciones especificadas.

  • find acción en las colecciones especificadas.

  • insert acción en las colecciones especificadas si la operación produce una inserción.

El rol con funcionalidad incorporada readWrite proporciona los privilegios necesarios.

Si configuras multi: true, usa el método update() solo para operaciones idempotentes.

Intentar usar el operador $expr con el indicador upsert establecido en true genera un error.

Para usar db.collection.update() con multi: false en una colección particionada, se debe incluir una coincidencia exacta en el campo _id o dirigirse a una única partición (por ejemplo, incluyendo la clave de partición).

Cuando el db.collection.update() realiza operaciones de actualización (y no operaciones de reemplazo de documentos), db.collection.update() puede dirigirse a varias particiones.

Las operaciones de reemplazo de documentos intentan apuntar a una única partición, primero utilizando el filtro de query. Si la operación no puede apuntar a una única partición mediante el filtro de query, entonces intenta apuntar mediante el documento de reemplazo.

En versiones anteriores, la operación intenta dirigirse utilizando el documento de reemplazo.

Para una db.collection.update() operación que incluya upsert: true y esté en una colección fragmentada, debe incluir la clave de fragmentación completa en filter el:

  • Para una operación de actualización.

  • Para una operación de reemplazo de documento.

Sin embargo, los documentos en una colección particionada pueden carecer de los campos de clave de partición. Para dirigirse a un documento que carece de la clave de partición, puede usar la coincidencia exacta null junto con otra condición de filtro (como en el campo _id). Por ejemplo:

{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key

Puede actualizarse el valor de clave de partición de un documento a menos que el campo de clave de partición sea el campo _id inmutable.

Para modificar el valor de la clave de partición existente con db.collection.update():

Tip

Dado que un valor de clave faltante se devuelve como parte de una coincidencia exacta nula, para evitar actualizar una clave con valor nulo, incluya condiciones de query adicionales (como en el campo _id) según corresponda.

Véase también upsert sobre una colección fragmentada.

Los documentos en una colección particionada pueden carecer de los campos de la clave de partición. Para usar db.collection.update() para establecer la clave de partición faltante del documento, se debe ejecutar en un mongos. No emitir la operación directamente en la partición.

Además, se aplican los siguientes requisitos:

Tarea
Requisitos

Para configurar en null

  • Puedes especificar multi: true.

  • Requiere un filtro de igualdad en la clave de partición completa si upsert: true.

Para establecer en un valor que no sea null

  • Debe realizarse dentro de una transacción o como una escritura reintentable.

  • Debes especificar multi: false.

  • Requiere filtro de igualdad en la clave de partición completa si:

    • upsert: true, o

    • si se utiliza un documento de reemplazo y el nuevo valor de clave de fragmentación pertenece a una partición diferente.

Tip

Dado que un valor de clave faltante se devuelve como parte de una coincidencia exacta nula, para evitar actualizar una clave con valor nulo, incluya condiciones de query adicionales (como en el campo _id) según corresponda.

Véase también:

db.collection.update() puede usarse dentro de transacciones distribuidas.

Importante

En la mayoría de los casos, una transacción distribuida incurre en un costo de rendimiento mayor que las escrituras de documentos individuales, y la disponibilidad de transacciones distribuidas no debería ser un sustituto para un diseño de esquema efectivo. Para muchos casos, el modelo de datos desnormalizado (documento incrustado y matrices) seguirá siendo óptimo para tus datos y casos de uso. Es decir, en muchos casos, modelar tus datos de forma adecuada minimizará la necesidad de transacciones distribuidas.

Para consideraciones adicionales sobre el uso de transacciones (como el límite de tiempo de ejecución y el límite de tamaño del oplog), consulta también las consideraciones de producción.

Puedes crear colecciones e índices dentro de una transacción distribuida si la transacción no es una transacción de escritura entre particiones.

db.collection.update() con upsert: true se puede ejecutar en una colección existente o en una colección inexistente. Si se ejecuta en una colección que es inexistente, la operación crea la colección.

No establezcas explícitamente el nivel de confirmación de escritura para la operación si se ejecuta en una transacción. Para usar el nivel de confirmación de escritura con transacciones, consulta Transacciones y nivel de confirmación de escritura.

Si una operación db.collection.update() actualiza con éxito uno o más documentos, la operación añade una entrada en el oplog (registro de operaciones). Si la operación falla o no encuentra ningún documento para actualizar, la operación no agrega una entrada en el OpLog.

Cuando ejecutas un update() con upsert: true y la consulta no coincide con ningún documento existente, MongoDB se negará a insertar un nuevo documento si la consulta especifica condiciones en el _id campo usando la notación de punto.

Esta restricción asegura que el orden de los campos incrustados en el documento _id esté bien definido y no dependa del orden especificado en el query.

Si intentas insertar un documento de esta manera, MongoDB genera un error.

Los upserts pueden crear documentos duplicados, a menos que haya un índice único para evitar duplicados.

Si todas las operaciones db.collection.update() terminan la fase de query antes de que cualquier cliente inserte datos exitosamente, y no existe un índice único en el campo name, cada operación db.collection.update() puede resultar en una inserción, creando múltiples documentos con name: Andy.

Un índice único en el campo name asegura que solo se cree un documento. Con un índice único en su lugar, las múltiples db.collection.update() operaciones ahora muestran el siguiente comportamiento:

  • Exactamente una operación db.collection.update() inserta correctamente un nuevo
    documento.
  • Outras operaciones db.collection.update() atualizam a recém-inserida

    documento o fallan debido a una colisión de clave única.

    Para que otras operaciones db.collection.update() puedan actualizar el documento recién insertado, se deben cumplir todas las condiciones siguientes:

    • La colección de destino tiene un índice único que provocaría un
      error de clave duplicada.
    • La operación de actualización no es updateMany o multi lo es
      false.
    • La condición de coincidencia de actualización es:

      • Un único predicado de igualdad. Por ejemplo { "fieldA" : "valueA" }

      • Un AND lógico de predicados de igualdad. Por ejemplo { "fieldA" : "valueA", "fieldB" : "valueB" }

    • Los campos del predicado de igualdad coinciden con los campos en el
      patrón único de clave de índice.
    • La operación de actualización no modifica ningún campo en el
      patrón único de clave de índice.

En el documento de actualización, usa el operador posicional filtrado $[<identifier>] para definir un identificador, al que luego puedes hacer referencia en los documentos de filtro de arreglo. No puedes tener un documento de filtro de arreglo para un identificador si dicho identificador no está incluido en el documento de actualización.

El <identifier> debe comenzar con una letra minúscula y contener solo caracteres alfanuméricos.

Puedes incluir el mismo identificador varias veces en el documento de actualización; sin embargo, para cada identificador distinto ($[identifier]) en el documento de actualización, debes especificar exactamente un documento de filtro de arreglo correspondiente. Es decir, no puedes especificar múltiples documentos de filtro de arreglo para el mismo identificador. Sin embargo, puedes especificar condiciones compuestas sobre el mismo identificador en un único documento de filtro

Nota

arrayFilters no está disponible para actualizaciones que utilizan un pipeline de agregación.

El método db.collection.update() devuelve un objeto WriteResult() que contiene el estado de la operación. Al tener éxito, el objeto WriteResult() contiene el número de documentos que coincidieron con la condición de la query, el número de documentos insertados por la actualización y el número de documentos modificados.

Si el método db.collection.update() encuentra errores de nivel de confirmación de escritura (write concern), los resultados incluyen el campo WriteResult.writeConcernError.

La siguiente tabla explica los posibles valores de WriteResult.writeConcernError.provenance:

Origen
Descripción

clientSupplied

El nivel de confirmación de escritura se especificó en la aplicación.

customDefault

El nivel de confirmación de escritura se originó a partir de un valor por defecto personalizado. Vea setDefaultRWConcern.

getLastErrorDefaults

El nivel de confirmación de escritura se originó en el campo settings.getLastErrorDefaults del set de réplicas.

implicitDefault

El nivel de confirmación de escritura (write concern) se originó en el servidor en ausencia de todas las demás especificaciones de nivel de confirmación de escritura (write concern).

Si el método db.collection.update() encuentra un error de nivel de confirmación de escritura (write concern), los resultados incluyen el campo WriteResult.writeError.

Los ejemplos de esta página utilizan datos del conjunto de datos de muestra sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en la implementación autogestionada de MongoDB, consultar Cargar el conjunto de datos de muestra. Si se realizó alguna modificación en las bases de datos de muestra, es posible que se deban descartar y volver a crear las bases de datos para ejecutar los ejemplos de esta página.

Si el <update> documento contiene modificadores del operador de actualizar, como aquellos que utilizan el modificador $set, entonces:

  • El documento <update> debe contener únicamente expresiones de operador de actualizar.

  • El método db.collection.update() actualiza únicamente los campos correspondientes en el documento.

    • Para actualizar un documento incrustado o un arreglo en su totalidad, especifica el valor de reemplazo para el campo.

    • Para actualizar campos particulares en un documento incrustado o en un arreglo, utilizar notación de puntos para especificar el campo.

db.movies.update(
{ title: "The Godfather" },
{
$inc: { "tomatoes.viewer.numReviews": 1 },
$set: {
"tomatoes.viewer.meter": 99
}
}
)
/* Corresponds to the following SQL statement:
* UPDATE movies
* SET tomatoes_viewer_numReviews = tomatoes_viewer_numReviews + 1,
* tomatoes_viewer_meter = 99
* WHERE title = "The Godfather"
*/

En esta operación:

  • El parámetro <query> de { title: "The Godfather" } especifica qué documento se debe actualizar

  • el operador $inc incrementa el campo numReviews en el documento incrustado tomatoes.viewer

  • el operador $set actualiza el campo meter en el documento incrustado tomatoes.viewer.

Si el parámetro query coincide con varios documentos, la operación solo actualiza un documento coincidente. Para actualizar varios documentos, establece la opción multi en true.

La siguiente operación utiliza el operador de actualización $push para añadir un valor al arreglo genres.

db.movies.update(
{ title: "The Matrix" },
{
$push: { genres: "Thriller" }
}
)

Después de la actualización, el arreglo genres incluye el nuevo valor.

La siguiente operación utiliza el operador $unset para remover el campo metacritic del documento "El Padrino".

db.movies.update(
{ title: "The Godfather" },
{ $unset: { metacritic: "" } }
)
/* $unset is similar (but not identical) to the following SQL
command which removes the ``metacritic`` field from the ``movies``
table
* UPDATE movies
* SET metacritic = NULL
* WHERE title = "The Godfather"
*/

Después de la actualización, el campo metacritic se elimina.

Si multi se establece en true, el método db.collection.update() actualiza todos los documentos que cumplen con los criterios <query>. La operación de actualización multi puede intercalarse con otras operaciones de lectura/guardado.

La siguiente operación configura el campo test_field en true para los documentos donde el título es “El Padrino” o “Matrix”.

db.movies.update(
{ title: { $in: ["The Godfather", "The Matrix"] } },
{ $set: { test_field: true } },
{ multi: true }
)
/* Corresponds to the following SQL statement:
* UPDATE movies
* SET test_field = true
* WHERE title IN ('The Godfather', 'The Matrix')
*/

La operación actualiza ambos documentos coincidentes.

No se puede especificar multi: true al realizar un reemplazo y el documento de actualización contiene solo field:value expresiones.

Tip

Cuando especificas la opción inserción: true:

  • Si los documentos coinciden con los criterios de query, db.collection.update() realiza una actualizar.

  • Si ningún documento cumple con los criterios de la query, db.collection.update() inserta un único documento.

    Nota

    Si se realizan varias operaciones de actualización/inserción idénticas casi simultáneamente, es posible que, al update() usarse con upsert: true, se creen documentos duplicados. Consulte la sección "Actualización/inserción con valores duplicados" para obtener más información.

Si especifica upsert: true en una colección fragmentada, debe incluir la clave de fragmentación completa filter en. Para obtener información adicional db.collection.update() sobre el comportamiento de en una colección fragmentada, consulte Colecciones fragmentadas.

Las siguientes pestañas muestran una variedad de usos del modificador upsert con update().

Si ningún documento coincide con los criterios de query y el parámetro <update> es un documento de reemplazo (es decir, contiene solo pares de campo y valor), la actualización inserta un nuevo documento con los campos y valores del documento de reemplazo.

  • Si especificas un campo _id en el parámetro de query o en el documento de reemplazo, MongoDB utiliza ese campo _id en el documento insertado.

  • Si no especifica un campo _id ni en el parámetro de query ni en el documento de reemplazo, MongoDB añade el campo _id con un valor de ObjectId generado aleatoriamente.

    No pueden especificarse diferentes valores de campo de _id en el parámetro de query y en el documento de reemplazo. De lo contrario, la operación falla.

Por ejemplo, la siguiente actualización establece la opción upsert true en:

db.movies.update(
{ title: "Test Movie 12345" },
{
$set: {
title: "Test Movie 12345",
year: 2024,
genres: [ "Documentary" ],
rated: "NR"
}
},
{ upsert: true }
)

Si ningún documento coincide con el parámetro <query>, la operación de actualización inserta un documento con solo el documento de reemplazo. Como no se especificó ningún campo _id en el documento de reemplazo o en el documento de query, la operación crea un nuevo ObjectId único para el campo _id del nuevo documento. Puedes ver el upsert reflejado en el WriteResult de la operación.

Si ningún documento coincide con los criterios de query y el parámetro <update> es un documento con expresiones de operadores de actualización, entonces la operación crea un documento base a partir de las cláusulas de igualdad en el parámetro <query> y aplica las expresiones del parámetro <update>.

Las operaciones de comparación del <query> no se incluirán en el nuevo documento. Si el nuevo documento no incluye el campo _id, MongoDB añade el campo _id con un valor ObjectId.

Por ejemplo, la siguiente actualización establece la opción upsert true en:

db.movies.update(
{ title: "Test Movie 67890" }, // Query parameter
{ // Update document
$set: { rated: "PG" },
$setOnInsert: { year: 2024, type: "movie" }
},
{ upsert: true } // Options
)

Si no hay documentos que coincidan con la condición de la query, la operación inserta el documento correspondiente.

Si el <update> parámetro es una canalización de agregación, la actualización crea un documento base a partir de las cláusulas de igualdad del <query> parámetro y, a continuación, aplica la canalización al documento para crear el documento que se va a insertar. Si el nuevo documento no incluye el _id campo, MongoDB añade el _id campo con un valor ObjectId.

Por ejemplo, el siguiente pipeline de agregación inserta un nuevo documento en la colección movies porque no existe un documento que coincida con el filtro de query:

db.movies.update(
{ title: "Test Movie ABC123" }, // Query parameter
[ // Aggregation pipeline
{ $set: {
year: 2024,
type: "movie",
rated: "NR",
lastModified: "$$NOW"
} }
],
{ upsert: true } // Options
)

Tip

Para obtener ejemplos adicionales de actualizaciones utilizando pipelines de agregación, consulta Actualizar con pipeline de agregación.

La siguiente operación especifica tanto la opción multi como la opción upsert. Si existen documentos coincidentes, la operación actualiza todos los documentos coincidentes. Si no existen documentos coincidentes, la operación inserta un nuevo documento.

db.movies.update(
{ title: { $in: ["The Godfather", "The Matrix"] } },
{ $set: { test_upsert_field: true } },
{ upsert: true, multi: true }
)

Ya que ambas películas existen en la colección, la operación actualiza ambos documentos coincidentes.

Si la colección no tuviera ningún documento coincidente, la operación resultaría en la inserción de un único documento utilizando los campos de las especificaciones <query> y <update>. Por ejemplo, considere la siguiente operación:

db.movies.update(
{ "title": "Test Movie Unique789" },
{ $set: { year: 2024, type: "movie" } },
{ upsert: true, multi: true }
)

La operación inserta el documento correspondiente en la colección movies.

El método db.collection.update() puede aceptar una pipeline de agregación [ <stage1>, <stage2>, ... ] que especifica las modificaciones a realizar. El pipeline puede constar de las siguientes etapas:

El uso de un pipeline de agregación permite una instrucción de actualización más expresiva, como expresar actualizaciones condicionales basadas en los valores actuales de los campos o actualizar un campo con el valor de otros campos.

En el siguiente ejemplo se crea un campo displayTitle que combina el título y el año de la película con una pipeline de agregación que realiza estas operaciones:

  • crea un campo displayTitle concatenando los campos title y year

  • establece una marca de tiempo lastModified

db.movies.update(
{ title: "The Godfather" },
[
{ $set: {
displayTitle: { $concat: [ "$title", " (", { $toString: "$year" }, ")" ] },
lastModified: "$$NOW"
}
}
]
)

El siguiente ejemplo actualiza las películas estrenadas en 2015 para calcular una puntuación combinada a partir de las calificaciones de IMDB y Tomatoes, y asignar una calificación basada en la puntuación.

db.movies.update(
{
year: 2015,
"imdb.rating": { $type: "number" },
"tomatoes.viewer.rating": { $type: "number" }
},
[
{ $set: {
combinedScore: {
$round: [
{ $avg: [
{ $multiply: [ "$imdb.rating", 10 ] },
{ $multiply: [ "$tomatoes.viewer.rating", 10 ] }
] },
1
]
},
lastUpdate: "$$NOW"
}
},
{ $set: {
grade: {
$switch: {
branches: [
{ case: { $gte: [ "$combinedScore", 80 ] }, then: "A" },
{ case: { $gte: [ "$combinedScore", 70 ] }, then: "B" },
{ case: { $gte: [ "$combinedScore", 60 ] }, then: "C" },
{ case: { $gte: [ "$combinedScore", 50 ] }, then: "D" }
],
default: "F"
}
}
}
}
],
{ multi: true }
)

Nota

El $set utilizado en la pipeline se refiere a la etapa de agregación $set, y no a los operadores de actualizar $set.

La etapa $set:

  • calcula un nuevo campo combinedScore promediando la calificación de IMDB (escalada por 10) y la calificación de espectadores de Tomatoes (escalada por 10), y luego redondeando a un decimal. Consulta $avg, $multiply y $round para obtener más información.

  • establece el campo lastUpdate al valor de la variable de agregación NOW.

  • asigna una calificación con letras basada en combinedScore utilizando el operador $switch.

Para actualizar todos los elementos del arreglo que coincidan con un criterio específico, utiliza el parámetro arrayFilters.

El siguiente ejemplo actualiza todas las películas que tienen "English" en su arreglo languages. La operación reemplaza "English" con "EN".

db.movies.update(
{ languages: "English" },
{ $set: { "languages.$[element]" : "EN" } },
{
arrayFilters: [ { "element": "English" } ],
multi: true
}
)

También puede utilizar el parámetro arrayFilters con el operador posicional filtrado para actualizar elementos específicos del arreglo que coincidan con el patrón.

El siguiente ejemplo utiliza la película "El Padrino" de la colección existente, que tiene un writers arreglo. La operación actualiza solo a los escritores cuyos nombres contengan "guion" añadiendo un sufijo.

db.movies.update(
{ title: "The Godfather" },
{ $set: { "writers.$[elem]" : { $concat: [ "$elem", " - UPDATED" ] } } },
{
arrayFilters: [ { "elem": { $regex: /screenplay/ } } ]
}
)

La operación se dirige al documento "El Padrino" y actualiza solo los elementos del arreglo que coinciden con los criterios del filtro. Después de la operación, los escritores que trabajaron en el guion tendrán " - ACTUALIZADO" adjunto.

La opción hint especifica qué índice utiliza MongoDB para la operación de actualización. Especifique un índice para garantizar un plan del query coherente cuando actualice varios documentos. Este ejemplo utiliza la colección movies existente de la base de datos sample_mflix.

En primer lugar, crea un índice en el campo year:

db.movies.createIndex( { year: 1 } )

La siguiente operación de actualización sugiere explícitamente que se utilice el { year: 1 } índice para actualizar todas las películas desde 20102015hasta:

db.movies.update(
{ year: { $gte: 2010, $lte: 2015 } }, // Query parameter
{ $set: { decade: "2010s" } }, // Update document
{ multi: true, hint: { year: 1 } } // Options
)

Nota

Si especifica un índice que no existe, la operación genera un error.

Para ver el índice utilizado, ejecuta explain en la operación:

db.movies.explain().update(
{ title: "The Godfather", year: { $gte: 1970 } },
{ $set: { test_hint_field: true } },
{ hint: { year: 1 } }
)

El db.collection.explain().update() no modifica los documentos.

Nuevo en la versión 5.0.

Para definir variables a las que puedas acceder en otras partes del comando, utiliza la opción let.

Nota

Para filtrar los resultados usando una variable, debes acceder a la variable dentro del operador $expr.

El ejemplo:

  • Define dos variables en la opción let: targetTitle (configurada en "The Matrix") y newTitle (configurada en "The Matrix Reloaded")

  • Utiliza $expr en el filtro de query para comparar el campo title del documento con la variable $$targetTitle

  • Utiliza una pipeline de agregación con $set para actualizar el campo title al valor de $$newTitle

db.movies.update(
{ $expr: { $eq: [ "$title", "$$targetTitle" ] } },
[ { $set: { sequel: "$$sequelTitle" } } ],
{ let : { targetTitle: "The Matrix", sequelTitle: "The Matrix Reloaded" } }
)

La siguiente operación a un set de réplicas especifica un nivel de confirmación de escritura (write concern) de w: 2 con un wtimeout de 5000 milisegundos. Esta operación regresa después de que el guardado se propaga tanto al primario como a un secundario, o expira después de 5 segundos.

db.movies.update(
{ num_mflix_comments: { $lte: 10 } },
{ $set: { featured: true } },
{
multi: true,
writeConcern: { w: 2, j: true, wtimeout: 5000 }
}
)

La operación se completa exitosamente después de que la escritura sea reconocida por el primario y al menos un secundario, según lo especificado por w: 2.

Cambiado en la versión 8.1.2.

Cuando db.collection.update() se ejecuta en mongos en un clúster fragmentado, siempre se reporta un writeConcernError en la respuesta, incluso cuando ocurre uno o más errores adicionales. En versiones anteriores, otros errores a veces hacían que db.collection.update() no informara los errores de nivel de confirmación de escritura (write concern).

Por ejemplo, si un documento no supera la validación, activando un error DocumentValidationFailed, y también ocurre un error de nivel de confirmación de escritura, tanto el error DocumentValidationFailed como el writeConcernError se devuelven en el campo de nivel superior de la respuesta.

Opcional. Especifica la intercalación que se debe utilizar para la operación.

La intercalación permite a los usuarios especificar reglas propias del lenguaje para la comparación de strings, como reglas para el uso de mayúsculas y minúsculas y marcas de acento.

La opción de intercalación tiene la siguiente sintaxis:

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

Al especificar la intercalación, el campo locale es obligatorio; todos los demás campos de intercalación son opcionales. Para las descripciones de los campos, consulta Documento de intercalación.

Si no se especifica la intercalación, pero la colección tiene una intercalación por defecto (ver db.createCollection()), la operación utiliza la intercalación especificada para la colección.

Si no se especifica ninguna intercalación para la colección o para las operaciones, MongoDB utiliza la comparación binaria simple usada en versiones anteriores para las comparaciones de strings.

No puedes especificar varias intercalaciones para una operación. Por ejemplo, no puedes especificar diferentes intercalaciones por campo, o si realizas una búsqueda con un ordenamiento, no puedes usar una intercalación para la búsqueda y otra para el ordenamiento.

Esta operación actualiza todas las películas con títulos que comienzan por night y utiliza strength: 1 para comparar sin distinguir mayúsculas y minúsculas:

db.movies.update(
{ title: /^night/i },
{ $set: { updated: true } },
{
collation: { locale: "en", strength: 1 },
multi: true
}
)