Docs Menu
Docs Home
/ /

actualizar (comando de base de datos)

update

El update El comando modifica documentos de una colección. Un solo comando puede contener varias instrucciones de update actualización.

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.

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

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.

sort

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 $sort no es un "ordenamiento estable", lo que significa que no se garantiza que los documentos con claves de ordenamiento equivalentes permanezcan en el mismo orden relativo en la salida y en la entrada.

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 _id en la query de ordenación.

Para obtener más información, consulta Coherencia de organización.

Nuevo en la versión 8.0.

No puedes utilizar sort con multi: true.

Para un sort ejemplo, consulta Operación de actualización con ordenación.

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.

IMPORTANTE: A partir de MongoDB 8.2, si especificas c en un comando update que no contiene un pipeline, update devuelve un error.

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, 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.

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.

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.

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.

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.

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.

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

Nota

La operación $set utilizada en la pipeline se refiere a la etapa de agregación $set y no al operador de actualizar $set.

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

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 calcula un nuevo $set campo age basado en la diferencia entre 2026 y el año de estreno de la película. Consulte para obtener más $subtract información.
Segunda etapa
La etapa calcula un nuevo $set campo era basado en el year campo mediante lógica condicional. Consulte para obtener más información sobre $switch el $switch operador de agregación.

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 featured

  • clasifica películas cortas de drama y romance de 2012 como melodrama

  • Inserta 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,
'...': '...'
}

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

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

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

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

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.

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

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

Documento 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 update se ejecuta en mongos, 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 que update no informara de los errores del nivel de confirmación de escritura (write concern).

Los documentos writeConcernError contienen 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.

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.

Volver

mapReduce

En esta página