Importante
Método obsoleto de mongosh
Definición
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 método
db.collection.update()actualiza un único documento. Incluye la opción multi: true para actualizar todos los documentos que cumplan con los criterios de query.
Compatibilidad
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 el soporte de Atlas para 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.
Sintaxis
Modificado 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> } )
Parámetros
El método db.collection.update() toma 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 Cuando ejecutas una | |||||||
documento o pipeline | Las modificaciones que se deben aplicar puede ser una de las siguientes:
Para obtener más detalles y ejemplos, consulta Entradas del Oplog. | |||||||
booleano | Opcional. Cuando
Si tanto Para evitar múltiples inserciones, asegúrate de que los campos del Se establece por defecto en | |||||||
booleano | Opcional. Si se establece en | |||||||
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 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 | |||||||
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 | |||||||
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, utiliza el 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 string que especifica el índice que se utilizará para respaldar el predicado de query. 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 un ejemplo, consulta Especificar | |||||||
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: 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 ( Para usar una variable para los resultados del filtro, debes acceder a la variable dentro del operador Para un ejemplo completo usando | |||||||
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 |
Devuelve
El método devuelve un documento WriteResult que contiene el estado de la operación.
Control de acceso
En las implementaciones que se ejecutan con authorization, el usuario debe tener acceso que incluya los siguientes privilegios:
updateacción en las colecciones especificadas.findacción en las colecciones especificadas.insertacción en las colecciones especificadas si la operación produce una inserción.
El rol con funcionalidad incorporada readWrite proporciona los privilegios necesarios.
Comportamiento
Limitaciones
Si configuras multi: true, usa el método update() solo para operaciones idempotentes.
Uso de $expr en una actualización con Upsert
Intentar usar el operador $expr con la bandera de inserción configurada en true generará un error.
Colecciones fragmentadas
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.
Reemplazar operaciones de documentos en una colección particionada
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.
upsert en una colección fragmentada
Para una db.collection.update() operación que incluya inserción: true y esté en una colección particionada, debes incluir la clave de partición completa en el filter:
Para una operación de actualización.
Para una operación de reemplazo de documento.
Sin embargo, a los documentos de una colección fragmentada pueden faltarles los campos de clave de fragmento. Para identificar un documento que no tenga la clave de fragmento, puede usar la null coincidencia de igualdad. Junto con otra condición de filtro (como en el _id campo). Por ejemplo:
{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key
Modificación de la clave de fragmentación
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 clave de fragmentación existente con db.collection.update():
Debes ejecutar en un
mongos. No emitas la operación directamente en la partición.Usted debe ejecutar ya sea en una transacción o como una escritura reintentable.
Debes especificar
multi: false.Se debe incluir un filtro de query en la clave de partición completa.
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 en una colección particionada.
Clave de fragmentación faltante
Los documentos en una colección particionada pueden carecer de los campos de 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 realizar la operación directamente en la partición.
Además, se aplican los siguientes requisitos:
Tarea | Requisitos |
|---|---|
Para configurar en |
|
Para establecer en un valor que no sea |
|
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:
Transacciones
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.
Inserta dentro de transacciones
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 puede ejecutarse 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.
Nivel de confirmación de escritura y transacciones
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.
Entradas de OpLog
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.
Inserción con query punteada _id
Cuando se ejecuta un update() con upsert:
true y el query no coincide con ningún documento existente, MongoDB se negará a insertar un nuevo documento si el query especifica condiciones en el campo _id usando notación de puntos.
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 intenta insertar un documento de esta manera, MongoDB genera un error.
Inserción con valores duplicados
Los upserts pueden crear documentos duplicados, a menos que haya un índice único para evitar duplicados.
Si todas las db.collection.update() operaciones finalizan la fase de consulta antes de que cualquier cliente inserte datos exitosamente, y no hay un índice único en el name campo, cada db.collection.update() operación puede resultar en una inserción, creando múltiples documentos name: Andy con.
Un índice único en el campo name garantiza la creación de un solo documento. Con un índice único, las operaciones múltiples db.collection.update() ahora presentan el siguiente comportamiento:
- Exactamente una operación
db.collection.update()insertará con éxito un nuevo - documento.
- Exactamente una operación
- Outras operaciones
db.collection.update()atualizam a recém-inserida documento o fallar debido a una colisión de clave única.
Para que otras
db.collection.update()operaciones actualicen el documento recién insertado, se deben cumplirtodas las siguientes condiciones:- La colección de destino tiene un índice único que causaría una
- Error de clave duplicada.
- La operación de actualización no es
updateManyomulties false.
- La operación de actualización no es
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 en el predicado de igualdad coinciden con los campos en el
- Patrón de clave de índice único.
- La operación de actualización no modifica ningún campo en el
- Patrón de clave de índice único.
- Outras operaciones
Tip
Operaciones de actualización de matrices
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.
Puede 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, debe especificar exactamente un documento de filtro de matriz correspondiente. Es decir, no puede especificar varios documentos de filtro de matriz para el mismo identificador. Sin embargo, puede especificar condiciones compuestas para el mismo identificador en un solo documento de filtro.
Nota
arrayFilters no está disponible para actualizaciones que utilizan un pipeline de agregación.
WriteResult
Resultados exitosos
El método db.collection.update() devuelve un objeto que contiene el estado de la WriteResult() WriteResult() operación. Si la operación se realiza correctamente, el objeto contiene el número de documentos que cumplen la condición de consulta, el número de documentos insertados por la actualización y el número de documentos modificados.
Errores de nivel de confirmación de escritura
Si el db.collection.update() método encuentra errores de escritura, los resultados incluyen el WriteResult.writeConcernError campo.
La siguiente tabla explica los posibles valores de WriteResult.writeConcernError.provenance:
Origen | Descripción |
|---|---|
| El nivel de confirmación de escritura se especificó en la aplicación. |
| El nivel de confirmación de escritura se originó a partir de un valor por defecto personalizado. Vea |
| El nivel de confirmación de escritura se originó en el campo |
| 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). |
Errores no relacionados con el nivel de confirmación de escritura (write concern)
Si el método encuentra un error que no db.collection.update() WriteResult.writeError es de escritura, los resultados incluyen el campo.
Ejemplos
Los ejemplos de esta página utilizan datos del conjunto de datos de ejemplo sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en su implementación de MongoDB autogestionada, consulte Cargar el conjunto de datos de ejemplo. Si realizó alguna modificación en las bases de datos de ejemplo, es posible que deba eliminarlas y volver a crearlas para ejecutar los ejemplos de esta página.
Utilice expresiones de operador de actualización ($inc $sety)
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 actualizarEl operador incrementa
$incelnumReviewscampo en eltomatoes.viewerdocumento incrustadoEl operador actualiza
$setelmetercampo en eltomatoes.viewerdocumento incrustado.
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.
Añadir elementos al arreglo existente ($push)
La siguiente operación utiliza el $push operador de actualización para agregar un valor a la genres matriz.
db.movies.update( { title: "The Matrix" }, { $push: { genres: "Thriller" } } )
Después de la actualización, la matriz genres incluye el nuevo valor.
Tip
Remover campos ($unset)
La siguiente operación utiliza el operador para eliminar $unset el metacritic campo 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, se elimina el campo metacritic.
Actualizar múltiples documentos ($update con multi)
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 establece 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 puedes especificar multi: true cuando realizas un reemplazo y el documento de actualización contiene únicamente expresiones field:value.
Tip
Insertar un nuevo documento si no existe ninguna coincidenciaUpsert ()
Cuando especificas la opción inserción: true:
Si los documentos coinciden con los criterios de query,
db.collection.update()realiza una actualización.Si ningún documento cumple con los criterios del query,
db.collection.update()inserta un único documento.Nota
Si se emiten múltiples inserciones idénticas aproximadamente al mismo tiempo, es posible que
update()utilizado con upsert: true cree documentos duplicados. Consulta Inserción con valores duplicados para más información.
Si especificas upsert: true en una colección particionada, debes incluir la clave de partición completa en el filter. Para obtener información adicional sobre el comportamiento db.collection.update() en una colección particionada, consulta Colecciones particionadas.
Las siguientes pestañas muestran una variedad de usos del modificador upsert con update().
Inserción con un documento de reemplazo
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
_iden el parámetro de query o en el documento de reemplazo, MongoDB utiliza ese campo_iden el documento insertado.Si no especificas un campo
_idni en el parámetro de query ni en el documento de reemplazo, MongoDB añade el campo_idcon un valor de ObjectId generado aleatoriamente.No pueden especificarse diferentes valores de campo de
_iden el parámetro de query y en el documento de reemplazo. De lo contrario, la operación falla.
Por ejemplo, la siguiente actualización configura la opción inserción a true:
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 <query> parámetro, la operación de actualización inserta un documento solo con el documento de reemplazo. Dado que no _id se especificó ningún campo en el documento de reemplazo ni en el documento de consulta, la operación crea un nuevo campo único ObjectId para el campo del nuevo _id documento. Puede ver el upsert reflejado en el resultado de escritura de la operación.
Actualización o inserción con expresiones de operador ($set)
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 configura la opción inserción a true:
db.movies.update( { title: "Test Movie 67890" }, // Query parameter { // Update document $set: { rated: "PG" }, $setOnInsert: { year: 2024, type: "movie" } }, { upsert: true } // Options )
Si ningún documento coincide con la condición de consulta, la operación inserta el documento correspondiente.
Tip
Inserción con una pipeline de agregación
Si el parámetro <update> es un pipeline de agregación, la actualización crea un documento base a partir de las cláusulas de igualdad en el parámetro <query> y luego aplica el pipeline al documento para crear el documento a insertar. Si el nuevo documento no incluye el campo _id, MongoDB añade el campo _id con un valor de tipo ObjectId.
Por ejemplo, la siguiente canalización de agregación inserta un nuevo documento en la colección movies porque no hay ningún documento existente que coincida con el filtro de consulta:
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 canalizaciones de agregación, consulta Actualizar con pipeline de agregación.
Usando upsert con multi (Coincidencia)
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 } )
Como ambas películas existen en la colección, la operación actualiza ambos documentos coincidentes.
Usando upsert con multi (Sin coincidencia)
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.
Actualiza con el pipeline de agregación
El método db.collection.update() puede aceptar una pipeline de agregación [ <stage1>, <stage2>, ... ] que especifica las modificaciones a realizar. La pipeline puede constar de las siguientes etapas:
$addFieldsy su alias$set$replaceRooty su alias$replaceWith
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.
Modificar un campo utilizando los valores de los otros campos en el documento
El siguiente ejemplo crea un campo displayTitle que combina el título y el año de la película con una canalización de agregación que realiza estas operaciones:
crea un campo
displayTitleconcatenando los campostitleyyearestablece una marca de tiempo
lastModified
db.movies.update( { title: "The Godfather" }, [ { $set: { displayTitle: { $concat: [ "$title", " (", { $toString: "$year" }, ")" ] }, lastModified: "$$NOW" } } ] )
Realizar actualizaciones condicionales basadas en los valores actuales de los campos
El siguiente ejemplo actualiza las películas estrenadas en 2015 para calcular una puntuación de calificación combinada de IMDB y Tomatoes, y asigna una calificación en función de 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
La etapa $set:
Calcula un nuevo campo
combinedScorepromediando la calificación de IMDB (escalada 10 por) y la calificación de audiencia de Tomatoes (escalada 10 por), redondeándola a un decimal.$avg$multiplyConsulta, y para más$roundinformación.establece el campo
lastUpdateal valor de la variable de agregaciónNOW.asigna una calificación de letra basada en
combinedScoreutilizando el$switchoperador.
Especifica arrayFilters para las operaciones de actualización de arreglos
Se deben actualizar los elementos que coinciden con los criterios arrayFilters
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 matriz languages. La operación reemplaza "English" por "EN".
db.movies.update( { languages: "English" }, { $set: { "languages.$[element]" : "EN" } }, { arrayFilters: [ { "element": "English" } ], multi: true } )
Actualizar elementos específicos de una matriz mediante coincidencia de patrones
También puede utilizar el parámetro arrayFilters con el operador posicional filtrado para actualizar elementos específicos de la matriz que coincidan con un patrón.
El siguiente ejemplo utiliza la película "El Padrino" de la colección existente, que tiene una matriz writers. La operación actualiza únicamente los guionistas cuyos nombres contienen "guión" añadiendo un sufijo.
db.movies.update( { title: "The Godfather" }, { $set: { "writers.$[elem]" : { $concat: [ "$elem", " - UPDATED" ] } } }, { arrayFilters: [ { "elem": { $regex: /screenplay/ } } ] } )
La operación se centra en el documento "El Padrino" y actualiza únicamente los elementos de la matriz que cumplen los criterios de filtrado. Tras la operación, se añade "- UPDATED" a los guionistas que trabajaron en el guion.
Especifica hint para las operaciones de actualización
La opción hint permite especificar el índice que MongoDB debe usar para la operación de actualización. Esto resulta útil al actualizar varios documentos y garantizar el uso de un índice específico para mejorar el rendimiento. Este ejemplo utiliza la colección movies existente de la base de datos sample_mflix.
Primero, crea un índice en el campo year:
db.movies.createIndex( { year: 1 } )
La siguiente operación de actualización sugiere explícitamente utilizar el { year: 1 } índice para actualizar todas las películas 2010de2015 a:
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.
Usar variables en let
Nuevo en la versión 5.0.
Para definir variables a las que puedes acceder en otros lugares 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(establecida en "The Matrix") ynewTitle(establecida en "The Matrix Reloaded")Utiliza
$expren el filtro de consulta para comparar el campotitledel documento con la variable$$targetTitleUtiliza una canalización de agregación con
$setpara actualizar el campotitleal valor de$$newTitle
db.movies.update( { $expr: { $eq: [ "$title", "$$targetTitle" ] } }, [ { $set: { sequel: "$$sequelTitle" } } ], { let : { targetTitle: "The Matrix", sequelTitle: "The Matrix Reloaded" } } )
Anular el nivel de confirmación de escritura (write concern) por defecto
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 luego de que el servidor primario y al menos un servidor secundario reconocen la escritura, como se especifica mediante w: 2.
Errores de nivel de confirmación de escritura (write concern) en clústeres particionados
Cambiado en la versión 8.1.2.
Cuando db.collection.update() se ejecuta en mongos en un clúster fragmentado, siempre se informa de un writeConcernError en la respuesta, incluso cuando se producen uno o más errores adicionales. En versiones anteriores, otros errores a veces causaban que db.collection.update() no reportara errores de nivel de confirmación de escritura.
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.
Especificar la intercalación
Especifica la intercalación a 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 con night y utiliza strength: 1 para la comparación sin distinguir entre mayúsculas y minúsculas:
db.movies.update( { title: /^night/i }, { $set: { updated: true } }, { collation: { locale: "en", strength: 1 }, multi: true } )