Definición
updateEl
updateEl comando modifica documentos de una colección. Un solo comando puede contener varias instrucciones deupdateactualización.Tip
mongoshEn, este comando también se puede ejecutar a través delupdateOne()MétodosupdateMany()replaceOne()findOneAndReplace()findOneAndUpdate()auxiliares,,, y.Los métodos asistente son convenientes para usuarios de
mongosh, pero es posible que no proporcionen el mismo nivel de información que los comandos de base de datos. En los casos en que no se necesite la conveniencia o se requieran campos de retorno adicionales, utiliza el comando de base de datos.
Compatibilidad
Este comando 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
Cambiado en la versión 8.0.
El comando tiene la siguiente sintaxis:
db.runCommand( { update: <collection>, updates: [ { q: <query>, u: <document or pipeline>, c: <document>, // Added in MongoDB 5.0 upsert: <boolean>, multi: <boolean>, collation: <document>, arrayFilters: <array>, hint: <document|string>, sort: <document> }, ... ], ordered: <boolean>, maxTimeMS: <integer>, writeConcern: { <write concern> }, bypassDocumentValidation: <boolean>, comment: <any>, let: <document> // Added in MongoDB 5.0 } )
Campos de comandos
El comando toma los siguientes campos:
Campo | Tipo | Descripción | |||||
|---|---|---|---|---|---|---|---|
| string | El nombre de la colección objetivo. | |||||
| arreglo | Un arreglo de una o más instrucciones de actualización para ejecutar en la colección especificada. Para más detalles sobre las instrucciones de actualización, se puede consultar Instrucciones de actualización. | |||||
| booleano | Opcional. Si | |||||
| non-negative integer | Opcional. Especifica un límite de tiempo en milisegundos. Si no especifica un valor para MongoDB finaliza las operaciones que exceden su límite de tiempo asignado utilizando el mismo mecanismo que | |||||
| Documento | Opcional. Un documento que expresa el nivel de confirmación de escritura del comando 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. | |||||
| booleano | Opcional. Le permite a | |||||
| any | Opcional. Un comentario proporcionado por el usuario para adjuntar a este comando. Una vez configurado, este comentario aparece junto a los registros de este comando en las siguientes ubicaciones:
Un comentario puede ser de cualquier tipo BSON válido (string, objeto, arreglo, etc.). | |||||
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 ver un ejemplo completo, se puede consultar Uso de variables en la opción Nuevo en la versión 5.0. | ||||||
| Documento | Opcional. Ordena los documentos antes de que se aplique la actualización. Si el argumento de orden no es un documento, la operación genera un error. MongoDB no almacena documentos en una colección en un orden específico. Al ordenar en un campo que contiene valores duplicados, los documentos que contienen esos valores pueden ser devueltos en cualquier orden. La operación Si el campo especificado en los criterios de ordenación no existe en dos documentos, entonces el valor por el cual se ordenan es el mismo. Los dos documentos pueden ser devueltos en cualquier orden. Si se desea un orden de clasificación coherente, se debe incluir al menos un campo en la clasificación que contenga valores únicos. La forma más sencilla de garantizar esto es incluir el campo Para obtener más información, consulta Coherencia de organización. Nuevo en la versión 8.0. No puedes utilizar Para un |
Actualizar instrucciones
Cada elemento del arreglo updates es un documento de instrucción para actualizar. Cada documento contiene los siguientes campos:
Campo | Tipo | Descripción | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Documento | La query que coincide con los documentos que se van a actualizar. Utiliza los mismos selectores de query que en el método | |||||||||||||||||||
documento o pipeline | Las modificaciones que se deben aplicar El valor puede ser:
Para obtener más detalles, se puede consultar Comportamiento. | |||||||||||||||||||
Documento | Opcional. Se puede especificar IMPORTANTE: A partir de MongoDB 8.2, si especificas 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 ver un ejemplo completo con Nuevo en la versión 5.0. | |||||||||||||||||||
booleano | Opcional. Cuando
Si tanto Para evitar múltiples inserciones, asegúrese de que los campos de Se establece por defecto en | |||||||||||||||||||
| booleano | Opcional. Si Al actualizar varios documentos, si un solo documento no se actualiza, los demás documentos no se actualizan. Se puede consultar errores de actualización múltiple para obtener más información sobre este comportamiento. | ||||||||||||||||||
| Documento | Opcional. 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: Al especificar la intercalación, el campo Si no se especifica la intercalación, pero la colección tiene una intercalación por defecto (ver 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. | ||||||||||||||||||
| arreglo | Opcional. Un arreglo de documentos de filtro que determina qué elementos del arreglo modificar para una operación de actualización en un campo de arreglo. En el documento de actualización, usa el operador posicional filtrado El Puedes incluir el mismo identificador varias veces en el documento de actualización; sin embargo, para cada identificador distinto ( Sin embargo, se pueden especificar condiciones compuestas sobre el mismo identificador en un único documento de filtro, como en los siguientes ejemplos: Para obtener ejemplos, consulta Especificar | ||||||||||||||||||
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 |
Devuelve
El comando devuelve un documento que contiene el estado de la operación. Por ejemplo:
{ "ok" : 1, "nModified" : 0, "n" : 1, "upserted" : [ { "index" : 0, "_id" : ObjectId("52ccb2118908ccd753d65882") } ] }
Para obtener detalles de los campos de salida, se puede consultar Salida.
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.
El rol con funcionalidad incorporada readWrite proporciona los privilegios necesarios.
Comportamiento
Limitaciones
Si se configura multi: true, se debe usar el comando update solo para las operaciones idempotentes.
Actualiza con un documento de actualización de expresiones de operador
El campo de instrucción de actualizar u puede aceptar un documento que solo contenga expresiones de operador de actualizar. Por ejemplo:
updates: [ { q: <query>, u: { $set: { status: "D" }, $inc: { quantity: 2 } }, ... }, ... ]
Luego, el comando update actualiza únicamente los campos correspondientes en el documento.
Actualizar con un documento de reemplazo
El campo de la instrucción de actualizar u puede aceptar un documento de reemplazo, es decir, el documento contiene solo expresiones field:value . Por ejemplo:
updates: [ { q: <query>, u: { status: "D", quantity: 4 }, ... }, ... ]
Luego, el comando update reemplaza el documento coincidente con el documento actualizado. El comando update solo puede sustituir a un único documento coincidente; es decir, el campo multi no puede ser true. El comando update no reemplaza el valor _id.
Errores de actualizaciones múltiples
Si un solo documento no se actualiza en un comando de actualización con el parámetro multi establecido en true, no se actualizarán más documentos como parte de ese comando.
Por ejemplo, la sample_mflix.movies colección contiene películas con imdb.rating campos. Cree un validador de documentos en la movies colección con una regla que establezca que el imdb.rating valor debe ser menor o igual 10 a:
db.runCommand( { update: "movies", updates: [ { q: { year: { $gte: 2000, $lte: 2005 }, "imdb.rating": { $type: "number" } }, u: { $inc: { "imdb.rating": 1 } }, multi: true } ] } )
Si alguna película ya tiene una calificación de 10, incrementarla infringiría la regla del validador (calificación > 10). En este caso, la actualización se detiene y no se actualizan más documentos, incluso si miles de documentos coinciden con la consulta.
Nota
Si se actualiza un subconjunto de documentos coincidentes, por ejemplo, cuando una actualización hace que algunos documentos no superen la validación de esquema, el valor de nModified devuelto por el comando update podría no ser preciso.
Actualiza con un pipeline de agregación
El campo de instrucción para actualizar u puede aceptar un pipeline de agregación [ <stage1>, <stage2>, ... ] que especifique las modificaciones a realizar. El 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.
Por ejemplo:
updates: [ { q: <query>, u: [ { $set: { status: "Modified", comments: [ "$misc1", "$misc2" ] } }, { $unset: [ "misc1", "misc2" ] } ], ... }, ... ]
Nota
Para ver ejemplos, consulta Actualización con pipeline de agregación.
Inserción con un índice único
Los upserts pueden crear documentos duplicados, a menos que haya un índice único para evitar duplicados.
Considere un ejemplo en el que no existe ningún documento con el nombre Andy y varios clientes emiten el siguiente comando aproximadamente al mismo tiempo:
db.runCommand( { update: "people", updates: [ { q: { name: "Andy" }, u: { $inc: { score: 1 } }, multi: true, upsert: true } ] } )
Si todas las operaciones update terminan la fase de query antes de que algún cliente inserte correctamente los datos y no hay un índice único en el campo name, cada operación update puede ocasionar 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 update operaciones ahora muestran el siguiente comportamiento:
Exactamente una
updateoperación insertará exitosamente un nuevo documento.Otras
updateoperaciones actualizan el documento recién insertado o fallan debido a una colisión de clave única.Para que otras operaciones de
updateactualicen el documento recién insertado, todas las siguientes condiciones deben cumplirse:La colección objetivo tiene un índice único que causaría un error de clave duplicada.
La operación de actualización no es
updateManyomultiesfalse.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 del patrón de clave del índice único.
La operación de actualización no modifica ningún campo en el patrón de clave de índice único.
La siguiente tabla muestra ejemplos de operaciones de upsert que, cuando ocurre una colisión de clave, se actualizan o fallan.
Patrón de clave de índice único | Operación de actualización | Resultado | ||||||
|---|---|---|---|---|---|---|---|---|
| | El campo | ||||||
| | La operación falla porque modifica el campo en el patrón de clave del índice único ( | ||||||
| | La operación falla porque los campos del predicado de igualdad ( |
Límites
Para cada elemento de actualización del arreglo updates, la suma de la query y los tamaños de actualización (es decir, q y u ) debe ser menor o igual al tamaño máximo de documento BSON.
El número total de instrucciones de actualización en el arreglo updates debe ser menor o igual al tamaño máximo por lotes.
Validación de esquema
El comando update añade compatibilidad con la opción bypassDocumentValidation, que le permite omitir la validación de esquema al insertar o actualizar documentos en una colección con reglas de validación.
Colecciones fragmentadas
upsert en una colección fragmentada
Para utilizar update con multi: false en una colección particionada,
Si no se especifica inserción: true, el filtro q debe incluir una coincidencia exacta en el campo
_ido apuntar a una sola partición (por ejemplo, incluyendo la clave de partición).Si se especifica inserción: true, el filtro q debe incluir una coincidencia exacta en la clave de partición.
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
nullcoincidencia de igualdad. Junto con otra condición de filtro (como en el_idcampo). Por ejemplo:{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key
Reemplazar Documento
Al reemplazar un documento, update intenta apuntar a una 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.
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 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 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
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.
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.
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.
Actualizar campos específicos de un documento
Se deben usar operadores de actualización para actualizar solo los campos especificados de un documento.
Por ejemplo, los documentos de la colección movies de la base de datos sample_mflix contienen campos como title, year y num_mflix_comments.
El siguiente comando utiliza los operadores de actualización $set y $inc para actualizar los campos year y num_mflix_comments de un documento donde title es igual a "The Godfather":
db.runCommand( { update: "movies", updates: [ { q: { title: "The Godfather" }, u: { $set: { year: 1972 }, $inc: { num_mflix_comments: 1 } } } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
Puesto que el documento <update> no especifica el campo multi opcional, la actualización solo modifica un documento, incluso si más de un documento cumple la condición de coincidencia q.
Se puede consultar Salida para obtener más detalles.
Actualizar campos específicos de varios documentos
Se deben usar operadores de actualización para actualizar solo los campos especificados de un documento e incluir el campo multi establecido en true en la instrucción de actualización.
Por ejemplo, los documentos de la colección movies de la base de datos sample_mflix contienen campos como year y num_mflix_comments.
El siguiente comando utiliza el $inc operador de actualización para incrementar el num_mflix_comments campo para todas las películas lanzadas 1924 en:
db.runCommand( { update: "movies", updates: [ { q: { year: 1924 }, u: { $inc: { num_mflix_comments: 1 }, $set: { classic: true, era: "silent" } }, multi: true } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
Como el campo multi está establecido en true, la actualización modifica todos los 6 documentos que coinciden con la consulta especificada en el campo q y devuelve el siguiente resultado:
{ n: 6, nModified: 6, ok: 1 }
Se puede consultar Salida para obtener más detalles.
Actualiza con el pipeline de agregación
El comando update puede utilizar un pipeline de agregación para la actualización. El 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.
Ejemplo 1
Los siguientes ejemplos utilizan el pipeline de agregación para modificar un campo mediante los valores de los otros campos del documento.
Los documentos de la colección users de la base de datos sample_mflix contienen campos como name y email.
La siguiente operación de actualización usa un pipeline de agregación para agregar nuevos campos al documento de un usuario específico:
db.runCommand( { update: "users", updates: [ { q: { name: "Robert Baratheon" }, u: [ { $set: { full_info: { $concat: [ "$name", " - ", "$email" ] } } }, { $set: { status: "active" } } ], multi: false } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
Ejemplo 2
La pipeline de agregación permite que la actualización realice actualizaciones condicionales basadas en los valores actuales de los campos y también utilice estos valores para calcular un valor diferente para otro campo.
Los documentos en la colección movies de la base de datos sample_mflix tienen un campo year.
El siguiente ejemplo utiliza una secuencia de agregación para calcular la antigüedad de "El gran robo del tren" y asignarle una clasificación de era en función de su fecha de estreno.
db.runCommand( { update: "movies", updates: [ { q: { title: "The Great Train Robbery" }, u: [ { $set: { age: { $subtract: [ 2026, "$year" ] } } }, { $set: { era: { $switch: { branches: [ { case: { $lt: [ "$year", 1960 ] }, then: "Classic" }, { case: { $lt: [ "$year", 1980 ] }, then: "Golden Age" }, { case: { $lt: [ "$year", 2000 ] }, then: "Modern" }, { case: { $gte: [ "$year", 2000 ] }, then: "Contemporary" } ], default: "Unknown" } } } } ], multi: false } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
Nota
- Primera etapa
- La etapa calcula un nuevo
$setcampoagebasado en la diferencia entre 2026 y el año de estreno de la película. Consulte para obtener más$subtractinformación. - Segunda etapa
- La etapa calcula un nuevo
$setcampoerabasado en elyearcampo mediante lógica condicional. Consulte para obtener más información sobre$switchel$switchoperador de agregación.
Actualización masiva
El siguiente ejemplo realiza varias operaciones de actualización en un solo comando para actualizar documentos existentes e insertar nuevos. La operación:
marca películas de terror altamente calificadas de 2015 como
featuredclasifica películas cortas de drama y romance de 2012 como
melodramaInserta una nueva película de ciencia ficción de 2024 si no existe
db.runCommand( { update: "movies", updates: [ // Update highly-rated Horror movies from 2015 { q: { year: 2015, genres: "Horror", "imdb.rating": { $gte: 7 } }, u: { $set: { featured: true } }, multi: true }, // Update short Drama/Romance movies from 2012 { q: { year: 2012, genres: { $all: ["Drama", "Romance"] }, runtime: { $lt: 90 } }, u: { $set: { category: "melodrama" } }, multi: true }, // Upsert a new movie from 2026 { q: { title: "A New Movie", year: 2026 }, u: { $set: { genres: ["Sci-Fi", "Adventure"], runtime: 142, "imdb.rating": 8.5, featured: true } }, upsert: true } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
El documento devuelto muestra que el comando modificó documentos existentes e insertó uno nuevo mediante upsert.Consulte la sección "Salida" para obtener más información.
{ n: 16, upserted: [ { index: 2, _id: ObjectId('69861e680e6ea1f51160fe1c') } ], nModified: 15, ok: 1, '...': '...' }
Especificar la intercalació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.
Los documentos de la colección movies de la base de datos sample_mflix tienen campos como title y year.
La siguiente operación usará la intercalación para realizar una búsqueda sin distinción entre mayúsculas y minúsculas. La query busca "the godfather" en minúsculas, pero con strength: 1 intercalación, la query coincide con "The Godfather" sin distinción de mayúsculas:
db.runCommand({ update: "movies", updates: [ { q: { title: "the godfather" }, u: { $set: { featured: true } }, collation: { locale: "en", strength: 1 } } ] })
Especifica arrayFilters para las operaciones de actualización de arreglos
Al actualizar el campo de un arreglo, puede especificar arrayFilters que determinen qué elementos del arreglo actualizar.
Se deben actualizar los elementos que coinciden con los criterios arrayFilters
Los documentos de la colección movies de la base de datos sample_mflix tienen un campo de matriz languages.
El siguiente ejemplo actualiza todas las películas que tienen "English" en su matriz languages. La operación reemplaza "English" por "EN".
db.runCommand( { update: "movies", updates: [ { q: { languages: "English" }, u: { $set: { "languages.$[element]" : "EN" } }, arrayFilters: [ { "element": "English" } ], multi: true} ] } )
Actualiza elementos específicos de un arreglo de documentos
Los documentos de la colección movies de la base de datos sample_mflix tienen una matriz cast que enumera los nombres de los actores.
El siguiente ejemplo actualiza todas las películas que tienen "Al Pacino" en su matriz cast, reemplazando "Al Pacino" por "REDACTED". La opción arrayFilters especifica qué elementos de la matriz se actualizarán:
db.runCommand({ update: "movies", updates: [ { q: { cast: "Al Pacino" }, u: { $set: { "cast.$[elem]" : "REDACTED" } }, arrayFilters: [ { "elem": "Al Pacino" } ], multi: true } ] })
La operación actualiza todas las 40 películas que tienen "Al Pacino" en la matriz cast, reemplazando su nombre con "REDACTED".
Especifica hint para las operaciones de actualización
Los documentos de la colección movies de la base de datos sample_mflix tienen campos como year y num_mflix_comments.
Cree los siguientes índices en la colección:
[ db.movies.createIndex( { year: 1 } ), db.movies.createIndex( { num_mflix_comments: 1 } ) ]
La siguiente operación de actualización incrementa el campo num_mflix_comments para "El Gran Robo del Tren" y sugiere explícitamente utilizar el índice { year: 1 }:
Nota
Si especifica un índice que no existe, la operación genera un error.
db.runCommand({ update: "movies", updates: [ { q: { title: "The Great Train Robbery" }, u: { $inc: { "num_mflix_comments": 1 } }, hint: { year: 1 }, multi: false } ] })
Para ver el índice utilizado, puede ejecutar en una operación de actualización. Por ejemplo, a continuación se explica una actualización que explain incrementa num_mflix_comments para películas con 5 o menos comentarios, estrenadas en 2000 o posteriormente:
db.runCommand( { explain: { update: "movies", updates: [ { q: { "num_mflix_comments": { $lte: 5 }, "year": { $gte: 2000 } }, u: { $inc: { "num_mflix_comments": 1 } }, hint: { year: 1 }, multi: true } ] }, verbosity: "queryPlanner" } )
El explain no modifica los documentos.
Usa variables en la opción let o en el campo c
Nuevo en la versión 5.0.
Las variables se pueden definir en la opción let o en el campo c y acceder a ellas en el arreglo updates.
Nota
Para filtrar los resultados usando una variable, debes acceder a la variable dentro del operador $expr.
Los documentos de la colección movies de la base de datos sample_mflix tienen campos como title y year.
El siguiente ejemplo utiliza la opción let para definir variables para buscar y agregar un nuevo campo a una película.
db.runCommand( { update: "movies", updates: [ { q: { $expr: { $eq: [ "$title", "$$movieTitle" ] } }, u: [ { $set: { franchise: "$$franchiseName" } } ] } ], let : { movieTitle: "The Godfather", franchiseName: "The Godfather Trilogy" } } )
El siguiente ejemplo define las variables movieTitle y franchiseName en c y utiliza las variables para agregar un campo franchise.
db.runCommand( { update: "movies", updates: [ { q: { $expr: { $eq: [ "$title", "$$movieTitle" ] } }, u: [ { $set: { franchise: "$$franchiseName" } } ], c: { movieTitle: "The Godfather", franchiseName: "The Godfather Trilogy" } } ] } )
Salida
El documento devuelto contiene un subconjunto de los siguientes campos:
update.nUn comando
updateacepta un arreglo de actualizaciones de documentos, algunas de las cuales pueden ser inserciones. Para una actualización,nes el número de documentos seleccionados para la actualización. Para una inserción,nes1para el documento insertado. El servidor añade los valores denpara todas las actualizaciones y, además, inserta y devuelve el total comoupdate.n.Si una operación de actualización no produce ningún cambio en el documento, p. ej. la expresión
$setactualiza el valor al valor actual,npuede ser mayor quenModified.
update.nModifiedEl número de documentos actualizados. Si la operación de actualización no produce ningún cambio en el documento, como establecer el valor del campo a su valor actual,
nModifiedpuede ser menor quen.Nota
Si se actualiza un subconjunto de documentos coincidentes, por ejemplo, cuando una actualización hace que algunos documentos no superen la validación de esquema, el valor de
nModifieddevuelto por el comandoupdatepodría no ser preciso.
update.upsertedUn arreglo de documentos que contiene información para cada documento insertado mediante la acción de actualizar con
upsert: true.Cada documento contiene la siguiente información:
update.writeErrorsUn arreglo de documentos que contiene información sobre cualquier error encontrado durante la operación de actualizar. El arreglo
writeErrorscontiene un documento de error por cada instrucción para actualizar que da error.Cada documento de error contiene los siguientes campos:
update.writeConcernErrorDocumento que describe los errores relacionados con el nivel de confirmación de escritura (write concern).
Cambiado en la versión 7.0.6: (también disponible en 6.0.14 y 5.0.30): Cuando
updatese ejecuta enmongos, siempre se informa de los errores de nivel de confirmación de escritura (write concern), incluso cuando se produce uno o más errores de escritura. En versiones anteriores, la aparición de errores de guardado podía hacer queupdateno informara de los errores del nivel de confirmación de escritura (write concern).Los documentos
writeConcernErrorcontienen los siguientes campos:update.writeConcernError.codeValor entero que identifica la causa del error del nivel de confirmación de escritura (write concern).
update.writeConcernError.errmsgUna descripción de la causa del error de nivel de confirmación de escritura (write concern).
update.writeConcernError.errInfo.writeConcernEl objeto del nivel de confirmación de escritura (write concern) usado para la operación correspondiente. Para obtener información sobre los campos del objeto de nivel de confirmación de escritura (write concern), se puede consultar Especificación de nivel de confirmación de escritura (write concern).
El objeto del nivel de confirmación de escritura (write concern) también puede contener el siguiente campo, que indica el origen del nivel de confirmación de escritura (write concern):
update.writeConcernError.errInfo.writeConcern.provenanceUn valor de string que indica dónde se originó el nivel de confirmación de escritura (write concern) (conocido como nivel de confirmación de escritura (write concern)
provenance). La siguiente tabla muestra los valores posibles para este campo y su significado:OrigenDescripciónclientSuppliedEl nivel de confirmación de escritura se especificó en la aplicación.
customDefaultEl nivel de confirmación de escritura se originó a partir de un valor por defecto personalizado. Vea
setDefaultRWConcern.getLastErrorDefaultsEl nivel de confirmación de escritura se originó en el campo
settings.getLastErrorDefaultsdel set de réplicas.implicitDefaultEl 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).
Cambiado en la versión 8.1.2.
Cuando 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 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.
Además de los campos de retorno específicos de actualizar mencionados, el db.runCommand() incluye información adicional:
para sets de réplicas:
optime,electionId,$clusterTimeyoperationTime.para clústeres fragmentados:
operationTimey$clusterTime.
Se puede consultar db.runCommand Response para obtener más información sobre estos campos.
Operación de actualización con una ordenación
Los documentos de la colección movies de la base de datos sample_mflix tienen campos como year, title y num_mflix_comments.
El siguiente ejemplo busca todas las películas desde 1972 y actualiza la que tiene más comentarios.
db.runCommand( { update: "movies", updates: [ { // Find movies from 1972 q: { year: 1972 }, // Add a classic_status field to the found movie u: { $set: { classic_status: "Most Discussed 1972 Film" } }, // Only update one movie multi: false, // Sort movies by comment count in descending order sort: { num_mflix_comments: -1 } } ] } )
La operación actualiza solo la 1972 película con la mayor cantidad de comentarios.