Definición
updateEl comando
updatemodifica documentos en una colección. Un solo comandoupdatepuede contener múltiples instrucciones para actualizar.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
Modificado en la versión 5.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> }, ... ], 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. |
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 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, crea una colección members con los siguientes documentos:
db.members.insertMany( [ { "_id" : 1, "member" : "Taylor", "status" : "pending", "points" : 1}, { "_id" : 2, "member" : "Alexis", "status" : "enrolled", "points" : 59}, { "_id" : 3, "member" : "Elizabeth", "status" : "enrolled", "points" : 34} ] )
La siguiente operación crea un validador de documentos en la colección members con la regla de que el valor points no puede ser igual a 60.
db.runCommand( { collMod: "members", validator: { points: { $ne: 60 } } } )
Este comando para actualizar aumenta el campo points de cada documento en 1.
db.runCommand( { update: "members", updates: [ { q: {}, u: { $inc: { points: 1 } }, multi: true } ] } )
Después de ejecutar el comando, la colección contiene los siguientes documentos:
{ _id: 1, member: 'Taylor', status: 'A', points: 2 } { _id: 2, member: 'Alexis', status: 'D', points: 59 } { _id: 3, member: 'Elizabeth', status: 'C', points: 34 }
El comando actualizar actualizó el valor points del primer documento, pero no pudo actualizar el segundo documento debido a la regla del validador de que el valor points no puede ser igual a 60. El tercer documento no se actualizó porque no se actualizan más documentos después de un error de guardado.
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
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, crea una colección members con los siguientes documentos:
db.members.insertMany([ { _id: 1, member: "abc123", status: "Pending", points: 0, misc1: "note to self: confirm status", misc2: "Need to activate" }, { _id: 2, member: "xyz123", status: "D", points: 59, misc1: "reminder: ping me at 100pts", misc2: "Some random comment" }, ])
El siguiente comando utiliza los operadores de actualización $set y $inc para actualizar los campos status y points de un documento donde member es igual a "abc123":
db.runCommand( { update: "members", updates: [ { q: { member: "abc123" }, u: { $set: { status: "A" }, $inc: { points: 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.
El documento devuelto muestra que el comando encontró y actualizó un solo documento. El comando devuelve:
{ "n" : 1, "nModified" : 1, "ok" : 1, <additional fields if run on a replica set/sharded cluster> }
Se puede consultar Salida para obtener más detalles.
Después del comando, la colección contiene los siguientes documentos:
{ "_id" : 1, "member" : "abc123", "status" : "A", "points" : 1, "misc1" : "note to self: confirm status", "misc2" : "Need to activate" } { "_id" : 2, "member" : "xyz123", "status" : "D", "points" : 59, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" }
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, una colección members contiene los siguientes documentos:
{ "_id" : 1, "member" : "abc123", "status" : "A", "points" : 1, "misc1" : "note to self: confirm status", "misc2" : "Need to activate" } { "_id" : 2, "member" : "xyz123", "status" : "D", "points" : 59, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" }
El siguiente comando utiliza los operadores de actualización $set y $inc para modificar los campos status y points respectivamente de todos los documentos de la colección:
db.runCommand( { update: "members", updates: [ { q: { }, u: { $set: { status: "A" }, $inc: { points: 1 } }, multi: true } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
La actualización modifica todos los documentos que coinciden con la query especificada en el campo q, es decir, la query vacía que coincide con todos los documentos de la colección.
El documento devuelto muestra que el comando encontró y actualizó varios documentos. Para un set de réplicas, el comando devuelve:
{ "n" : 2, "nModified" : 2, "ok" : 1, <additional fields if run on a replica set/sharded cluster> }
Se puede consultar Salida para obtener más detalles.
Después del comando, la colección contiene los siguientes documentos:
{ "_id" : 1, "member" : "abc123", "status" : "A", "points" : 2, "misc1" : "note to self: confirm status", "misc2" : "Need to activate" } { "_id" : 2, "member" : "xyz123", "status" : "A", "points" : 60, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" }
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.
Una colección members contiene los siguientes documentos:
{ "_id" : 1, "member" : "abc123", "status" : "A", "points" : 2, "misc1" : "note to self: confirm status", "misc2" : "Need to activate" } { "_id" : 2, "member" : "xyz123", "status" : "A", "points" : 60, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" }
Supongamos que, en lugar de los campos misc1 y misc2 separados, se quieren reunir en un nuevo campo comments. La siguiente operación para actualizar utiliza una pipeline de agregación para añadir el nuevo campo comments y remover los campos misc1 y misc2 de todos los documentos de la colección.
En primer lugar, se debe establecer el campo
statusen"Modified"y añadir un nuevo campocommentsque contemple el contenido actual de otros dos camposmisc1ymisc2.En segundo lugar, se deben remover los campos
misc1ymisc2.
db.runCommand( { update: "members", updates: [ { q: { }, u: [ { $set: { status: "Modified", comments: [ "$misc1", "$misc2" ] } }, { $unset: [ "misc1", "misc2" ] } ], multi: true } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
Nota
El documento devuelto muestra que el comando encontró y actualizó varios documentos. El comando devuelve:
{ "n" : 2, "nModified" : 2, "ok" : 1, <additional fields if run on a replica set/sharded cluster> }
Se puede consultar Salida para obtener más detalles.
Después del comando, la colección contiene los siguientes documentos:
{ "_id" : 1, "member" : "abc123", "status" : "Modified", "points" : 2, "comments" : [ "note to self: confirm status", "Need to activate" ] } { "_id" : 2, "member" : "xyz123", "status" : "Modified", "points" : 60, "comments" : [ "reminder: ping me at 100pts", "Some random comment" ] }
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.
db.students.insertMany( [ { "_id" : 1, "tests" : [ 95, 92, 90 ] }, { "_id" : 2, "tests" : [ 94, 88, 90 ] }, { "_id" : 3, "tests" : [ 70, 75, 82 ] } ] );
Al utilizar un pipeline de agregación, puedes actualizar los documentos con el promedio de calificaciones calculado y la calificación en letras.
db.runCommand( { update: "students", updates: [ { q: { }, u: [ { $set: { average : { $avg: "$tests" } } }, { $set: { grade: { $switch: { branches: [ { case: { $gte: [ "$average", 90 ] }, then: "A" }, { case: { $gte: [ "$average", 80 ] }, then: "B" }, { case: { $gte: [ "$average", 70 ] }, then: "C" }, { case: { $gte: [ "$average", 60 ] }, then: "D" } ], default: "F" } } } } ], multi: true } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
Nota
- Primera etapa
- La etapa
$setcalcula un nuevo campoaveragebasado en el promedio del campotests. Se puede consultar$avgpara obtener más información sobre el operador de agregación$avg. - Segunda etapa
- La etapa
$setcalcula un nuevo campogradebasado en el campoaveragecalculado en la etapa anterior. Consulta$switchpara obtener más información sobre el operador de agregación$switch.
El documento devuelto muestra que el comando encontró y actualizó varios documentos. El comando devuelve:
{ "n" : 3, "nModified" : 3, "ok" : 1, <additional fields if run on a replica set/sharded cluster> }
Después del comando, la colección contiene los siguientes documentos:
{ "_id" : 1, "tests" : [ 95, 92, 90 ], "average" : 92.33333333333333, "grade" : "A" } { "_id" : 2, "tests" : [ 94, 88, 90 ], "average" : 90.66666666666667, "grade" : "A" } { "_id" : 3, "tests" : [ 70, 75, 82 ], "average" : 75.66666666666667, "grade" : "C" }
Actualización masiva
El siguiente ejemplo realiza varias operaciones de actualización en la colección members:
db.runCommand( { update: "members", updates: [ { q: { status: "P" }, u: { $set: { status: "D" } }, multi: true }, { q: { _id: 5 }, u: { _id: 5, name: "abc123", status: "A" }, upsert: true } ], ordered: false, writeConcern: { w: "majority", wtimeout: 5000 } } )
El documento devuelto muestra que el comando modificó 10 documentos e insertó un documento con el valor _id 5. Se puede consultar Salida para obtener más detalles.
{ "ok" : 1, "nModified" : 10, "n" : 11, "upserted" : [ { "index" : 1, "_id" : 5 } ] }
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.
Una colección myColl tiene los siguientes documentos:
{ _id: 1, category: "café", status: "A" } { _id: 2, category: "cafe", status: "a" } { _id: 3, category: "cafE", status: "a" }
La siguiente operación incluye la opción de intercalación:
db.runCommand({ update: "myColl", updates: [ { q: { category: "cafe", status: "a" }, u: { $set: { status: "Updated" } }, collation: { locale: "fr", 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
Cree una colección students con los siguientes documentos:
db.students.insertMany( [ { "_id" : 1, "grades" : [ 95, 92, 90 ] }, { "_id" : 2, "grades" : [ 98, 100, 102 ] }, { "_id" : 3, "grades" : [ 95, 110, 100 ] } ] );
Para modificar todos los elementos que sean mayores o iguales a 100 en el arreglo grades, se debe utilizar el operador posicional filtrado $[<identifier>] con la opción arrayFilters:
db.runCommand( { update: "students", updates: [ { q: { grades: { $gte: 100 } }, u: { $set: { "grades.$[element]" : 100 } }, arrayFilters: [ { "element": { $gte: 100 } } ], multi: true} ] } )
Después de la operación, la colección contiene los siguientes documentos:
{ "_id" : 1, "grades" : [ 95, 92, 90 ] } { "_id" : 2, "grades" : [ 98, 100, 100 ] } { "_id" : 3, "grades" : [ 95, 100, 100 ] }
Actualiza elementos específicos de un arreglo de documentos
Cree una colección students2 con los siguientes documentos:
db.students2.insertMany( [ { "_id" : 1, "grades" : [ { "grade" : 80, "mean" : 75, "std" : 6 }, { "grade" : 85, "mean" : 90, "std" : 4 }, { "grade" : 85, "mean" : 85, "std" : 6 } ] }, { "_id" : 2, "grades" : [ { "grade" : 90, "mean" : 75, "std" : 6 }, { "grade" : 87, "mean" : 90, "std" : 3 }, { "grade" : 85, "mean" : 85, "std" : 4 } ] } ] )
Para modificar el valor del campo mean para todos los elementos del arreglo grades, donde la calificación sea mayor o igual a 85, utiliza el operador posicional filtrado $[<identifier>] con arrayFilters:
db.runCommand({ update: "students2", updates: [ { q: { }, u: { $set: { "grades.$[elem].mean" : 100 } }, arrayFilters: [ { "elem.grade": { $gte: 85 } } ], multi: true } ] })
Después de la operación, la colección tiene los siguientes documentos:
{ "_id" : 1, "grades" : [ { "grade" : 80, "mean" : 75, "std" : 6 }, { "grade" : 85, "mean" : 100, "std" : 4 }, { "grade" : 85, "mean" : 100, "std" : 6 } ] } { "_id" : 2, "grades" : [ { "grade" : 90, "mean" : 100, "std" : 6 }, { "grade" : 87, "mean" : 100, "std" : 3 }, { "grade" : 85, "mean" : 100, "std" : 4 } ] }
Especifica hint para las operaciones de actualización
Crea una colección de ejemplo members con los siguientes documentos:
db.members.insertMany([ { "_id" : 1, "member" : "abc123", "status" : "P", "points" : 0, "misc1" : null, "misc2" : null }, { "_id" : 2, "member" : "xyz123", "status" : "A", "points" : 60, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" }, { "_id" : 3, "member" : "lmn123", "status" : "P", "points" : 0, "misc1" : null, "misc2" : null }, { "_id" : 4, "member" : "pqr123", "status" : "D", "points" : 20, "misc1" : "Deactivated", "misc2" : null }, { "_id" : 5, "member" : "ijk123", "status" : "P", "points" : 0, "misc1" : null, "misc2" : null }, { "_id" : 6, "member" : "cde123", "status" : "A", "points" : 86, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment" } ])
Cree los siguientes índices en la colección:
db.members.createIndex( { status: 1 } ) db.members.createIndex( { points: 1 } )
La siguiente operación de actualización indica explícitamente que se debe usar el índice {
status: 1 }:
Nota
Si especifica un índice que no existe, la operación genera un error.
db.runCommand({ update: "members", updates: [ { q: { "points": { $lte: 20 }, "status": "P" }, u: { $set: { "misc1": "Need to activate" } }, hint: { status: 1 }, multi: true } ] })
El comando de actualización devuelve lo siguiente:
{ "n" : 3, "nModified" : 3, "ok" : 1 }
Para ver el índice utilizado, ejecuta explain en la operación:
db.runCommand( { explain: { update: "members", updates: [ { q: { "points": { $lte: 20 }, "status": "P" }, u: { $set: { "misc1": "Need to activate" } }, hint: { status: 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.
Cree una colección cakeFlavors:
db.cakeFlavors.insertMany( [ { _id: 1, flavor: "chocolate" }, { _id: 2, flavor: "strawberry" }, { _id: 3, flavor: "cherry" } ] )
El siguiente ejemplo define las variables targetFlavor y newFlavor en let y utiliza las variables para cambiar el sabor del pastel de cereza a naranja:
db.runCommand( { update: db.cakeFlavors.getName(), updates: [ { q: { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } }, u: [ { $set: { flavor: "$$newFlavor" } } ] } ], let : { targetFlavor: "cherry", newFlavor: "orange" } } )
El siguiente ejemplo define las variables targetFlavor y newFlavor en c y utiliza las variables para cambiar el sabor del bizcocho de chocolate a vainilla:
db.runCommand( { update: db.cakeFlavors.getName(), updates: [ { q: { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } }, u: [ { $set: { flavor: "$$newFlavor" } } ], c: { targetFlavor: "chocolate", newFlavor: "vanilla" } } ] } )
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.writeConcernErrorUna matriz de documentos que contiene información sobre cualquier error encontrado durante la operación de actualización.
Cambiado en la 6.0.14 versión: (tambiéndisponible 5.0.30 en): Cuando
updatese ejecuta en, siempre se informan errores de escritura, incluso si se producen unomongosupdateo más. En versiones anteriores, la ocurrencia de errores de escritura podía provocar que no informara errores de escritura.Cada documento de error contiene 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.
A continuación se muestra un ejemplo de un documento devuelto por un comando exitoso de update que realizó una inserción:
{ "ok" : 1, "nModified" : 0, "n" : 1, "upserted" : [ { "index" : 0, "_id" : ObjectId("52ccb2118908ccd753d65882") } ] }
El siguiente es un ejemplo de documento devuelto para una actualización masiva que involucra tres instrucciones de actualización, donde una instrucción de actualización se realizó correctamente y en las otras dos instrucciones de actualización se produjeron errores:
{ "ok" : 1, "nModified" : 1, "n" : 1, "writeErrors" : [ { "index" : 1, "code" : 16837, "errmsg" : "The _id field cannot be changed from {_id: 1.0} to {_id: 5.0}." }, { "index" : 2, "code" : 16837, "errmsg" : "The _id field cannot be changed from {_id: 2.0} to {_id: 6.0}." }, ] }