Docs Menu
Docs Home
/ /
Consultar y escribir

actualizar (comando de base de datos)

update

El comando update modifica documentos en una colección. Un solo comando update puede contener múltiples instrucciones para actualizar.

Tip

mongoshEn, este comando también se puede ejecutar a través del updateOne()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.

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.

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
}
)

El comando toma los siguientes campos:

Campo
Tipo
Descripción

update

string

El nombre de la colección objetivo.

updates

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.

ordered

booleano

Opcional. Si true, cuando falla una instrucción de actualización, vuelve sin realizar las instrucciones de actualización restantes. Si false, entonces cuando falle al actualizar, continúa con las instrucciones de actualizar restantes, si las hay. Se establece por defecto en true.

maxTimeMS

non-negative integer

Opcional.

Especifica un límite de tiempo en milisegundos. Si no especifica un valor para maxTimeMS, las operaciones no agotarán el tiempo de espera. Un valor de 0 especifica explícitamente el comportamiento por defecto sin límites.

MongoDB finaliza las operaciones que exceden su límite de tiempo asignado utilizando el mismo mecanismo que db.killOp(). MongoDB solo termina una operación en uno de sus puntos de interrupción designados.

writeConcern

Documento

Opcional. Un documento que expresa el nivel de confirmación de escritura del comando update. Se puede omitir usar el nivel de confirmación de escritura 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.

bypassDocumentValidation

booleano

Opcional. Le permite a update omitir la validación de esquema durante la operación. Esto permite actualizar documentos que no cumplen con los requisitos de validación.

comment

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:

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

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

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

Para ver un ejemplo completo, se puede consultar Uso de variables en la opción let o en el campo c.

Nuevo en la versión 5.0.

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 find().

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 c solo si u es un pipeline.

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

La sintaxis del documento es:

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

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

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

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

Para ver un ejemplo completo con let y variables, se puede consultar Uso de variables en la opción let o en el campo c.

Nuevo en la versión 5.0.

booleano

Opcional. Cuando true, update puede:

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

  • Actualiza un solo documento que coincida con query.

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

Para evitar múltiples inserciones, asegúrese de que los campos de query estén indexados de forma única. Consulte Inserción con un índice único para ver un ejemplo.

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

multi

booleano

Opcional. Si true, actualiza todos los documentos que cumplen los criterios de la query. Si false, limita la actualización a un documento que cumpla con los criterios de la query. Se establece por defecto en false.

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.

collation

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:

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.

arrayFilters

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 $[<identifier>] para definir un identificador, al que luego puedes hacer referencia en los documentos de filtro de arreglo. No puedes tener un documento de filtro de arreglo para un identificador si dicho identificador no está incluido en el documento de actualización.

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

Puedes incluir el mismo identificador varias veces en el documento de actualización; sin embargo, para cada identificador distinto ($[identifier]) en el documento de actualización, debes especificar exactamente un documento de filtro de arreglo correspondiente. Es decir, no puedes especificar múltiples documentos de filtro de arreglo para el mismo identificador. Por ejemplo, si la instrucción de actualizar incluye el identificador x (posiblemente varias veces), no puedes especificar lo siguiente para arrayFilters que incluya dos documentos de filtro separados para x:

// INVALID
[
{ "x.a": { $gt: 85 } },
{ "x.b": { $gt: 80 } }
]

Sin embargo, se pueden especificar condiciones compuestas sobre el mismo identificador en un único documento de filtro, como en los siguientes ejemplos:

// Example 1
[
{ $or: [{"x.a": {$gt: 85}}, {"x.b": {$gt: 80}}] }
]
// Example 2
[
{ $and: [{"x.a": {$gt: 85}}, {"x.b": {$gt: 80}}] }
]
// Example 3
[
{ "x.a": { $gt: 85 }, "x.b": { $gt: 80 } }
]

Para obtener ejemplos, consulta Especificar arrayFilters para operaciones de actualización de arreglos.

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 hint para las operaciones de actualización.

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.

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

  • update acción en las colecciones especificadas.

  • find acción en las colecciones especificadas.

  • insert acción en las colecciones especificadas.

El rol con funcionalidad incorporada readWrite proporciona los privilegios necesarios.

Si se configura multi: true, se debe usar el comando update solo para las operaciones idempotentes.

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.

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.

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.

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:

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

La $set y $unset utilizadas en la pipeline se refieren a las etapas de agregación $set y $unset respectivamente, y no a los operadores de actualización $set y $unset.

Para ver ejemplos, consulta Actualización con pipeline de agregación.

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 update operación insertará exitosamente un nuevo documento.

  • Otras update operaciones actualizan el documento recién insertado o fallan debido a una colisión de clave única.

    Para que otras operaciones de update actualicen 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 updateMany o multi es false.

    • La condición de coincidencia de actualización es:

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

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

    • Los campos del predicado de igualdad coinciden con los campos 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
{ name : 1 }
db.people.updateOne(
{ name: "Andy" },
{ $inc: { score: 1 } },
{ upsert: true }
)

El campo score del documento coincidente se incrementa en 1.

{ name : 1 }
db.people.updateOne(
{ name: { $ne: "Joe" } },
{ $set: { name: "Andy" } },
{ upsert: true }
)

La operación falla porque modifica el campo en el patrón de clave del índice único (name).

{ name : 1 }
db.people.updateOne(
{ name: "Andy", email: "andy@xyz.com" },
{ $set: { active: false } },
{ upsert: true }
)

La operación falla porque los campos del predicado de igualdad (name, email) no coinciden con el campo clave del índice (name).

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.

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.

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 _id o 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 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

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.

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:

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.

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 null

  • Puedes especificar multi: true.

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

Para establecer en un valor que no seanull:

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

  • Debes especificar multi: false.

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

    • upsert: true, o

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

Tip

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

Véase también:

update puede usarse dentro de transacciones distribuidas.

Importante

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

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

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

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.

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.

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" }

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" }

El comando update puede utilizar un pipeline de agregación para la actualización. El pipeline puede constar de las siguientes etapas:

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

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 status en "Modified" y añadir un nuevo campo comments que contemple el contenido actual de otros dos campos misc1 y misc2.

  • En segundo lugar, se deben remover los campos misc1 y misc2.

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

La $set y $unset utilizadas en la pipeline se refieren a las etapas de agregación $set y $unset respectivamente, y no a los operadores de actualización $set y $unset.

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" ] }

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

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

Primera etapa
La etapa $set calcula un nuevo campo average basado en el promedio del campo tests. Se puede consultar $avg para obtener más información sobre el operador de agregación $avg.
Segunda etapa
La etapa $set calcula un nuevo campo grade basado en el campo average calculado en la etapa anterior. Consulta $switch para 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" }

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
}
]
}

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 } }
]
})

Al actualizar el campo de un arreglo, puede especificar arrayFilters que determinen qué elementos del arreglo actualizar.

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 ] }

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 }
]
}

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.

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" } }
]
} )

El documento devuelto contiene un subconjunto de los siguientes campos:

update.ok

El estado del comando.

update.n

Un comando update acepta un arreglo de actualizaciones de documentos, algunas de las cuales pueden ser inserciones. Para una actualización, n es el número de documentos seleccionados para la actualización. Para una inserción, n es 1 para el documento insertado. El servidor añade los valores de n para todas las actualizaciones y, además, inserta y devuelve el total como update.n.

Si una operación de actualización no produce ningún cambio en el documento, p. ej. la expresión$set actualiza el valor al valor actual, n puede ser mayor que nModified.

update.nModified

El 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, nModified puede ser menor que n.

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.

update.upserted

Un 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.upserted.index

Un entero que identifica la actualización con la instrucción upsert:true en el arreglo updates, que utiliza un índice basado en cero.

update.upserted._id

El valor _id del documento añadido.

update.writeErrors

Un arreglo de documentos que contiene información sobre cualquier error encontrado durante la operación de actualizar. El arreglo writeErrors contiene un documento de error por cada instrucción para actualizar que da error.

Cada documento de error contiene los siguientes campos:

update.writeErrors.index

Un entero que identifica la instrucción para actualizar en el arreglo updates, que utiliza un índice basado en cero.

update.writeErrors.code

Valor entero que identifica el error.

update.writeErrors.errmsg

Una descripción del error.

update.writeConcernError

Una 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 update se ejecuta en, siempre se informan errores de escritura, incluso si se producen uno mongos update o 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.code

Valor entero que identifica la causa del error del nivel de confirmación de escritura (write concern).

update.writeConcernError.errmsg

Una descripción de la causa del error de nivel de confirmación de escritura (write concern).

update.writeConcernError.errInfo.writeConcern

El 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.provenance

Un 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:

Origen
Descripción

clientSupplied

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

customDefault

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

getLastErrorDefaults

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

implicitDefault

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

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, $clusterTime y operationTime.

  • para clústeres fragmentados: operationTime y $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}."
},
]
}

Volver

resetError

En esta página