Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

db.colección.updateMany() (método mongosh)

MongoDB con controladores

Esta pågina documenta un método de mongosh. Para ver el método equivalente en un controlador de MongoDB, consulte la pågina correspondiente a su lenguaje de programación:
db.collection.updateMany(filter, update, options)

Actualiza todos los documentos que coincidan con el filtro especificado para una colecciĂłn.

Este método estå disponible en implementaciones alojadas en los siguientes entornos:

  • MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube

Nota

Este comando es compatible con todos los clĂșsteres de MongoDB Atlas. Para obtener informaciĂłn sobre el soporte de Atlas para todos los comandos, consulte Comandos no compatibles.

  • MongoDB Enterprise: La versiĂłn basada en suscripciĂłn y autogestionada de MongoDB

  • MongoDB Community: La versiĂłn de MongoDB con cĂłdigo fuente disponible, de uso gratuito y autogestionada.

El método updateMany() tiene la siguiente forma:

db.collection.updateMany(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string>,
let: <document>,
maxTimeMS: <int>,
bypassDocumentValidation: <boolean>
}
)

El método updateMany() acepta los siguientes paråmetros:

Parameter
Tipo
DescripciĂłn

Documento

Los criterios de selección para actualizar. Los mismos selectores query que en el método find() estån disponibles.

Especifica un documento vacĂ­o { } para actualizar todos los documentos de la colecciĂłn.

documento o pipeline

Las modificaciones que se deben aplicar puede ser una de las siguientes:

Contiene Ășnicamente las siguientes etapas de agregaciĂłn:

Para obtener mĂĄs informaciĂłn, consulta Actualizar con una pipeline de agregaciĂłn.

Para actualizar con un documento de reemplazo, consulta db.collection.replaceOne().

upsert

booleano

Opcional. Cuando true, updateMany() ya sea:

  • Crea un nuevo documento si no hay documentos que coincidan con filter. Para mĂĄs detalles, consulta comportamiento de inserciĂłn.

  • Actualiza los documentos que coincidan con filter.

Para evitar mĂșltiples inserciones, asegĂșrate de que los campos de filter estĂ©n indexados de forma Ășnica.

Se establece por defecto en false.

writeConcern

Documento

Opcional. Un documento que expresa el nivel de confirmaciĂłn de escritura. Omite el uso del 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.

collation

Documento

Opcional.

Opcional. Especifica la intercalaciĂłn que se debe 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 determinan 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 ver ejemplos, se puede consultar Especificar arrayFilters para operaciones de actualizaciĂłn de arreglos.

Documento o string

Opcional. Un documento o cadena que especifica el Ă­ndice que se utilizarĂĄ para admitir el predicadode la consulta.

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.

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 usar una variable para los resultados del filtro, debes acceder a la variable dentro del operador $expr.

Para un ejemplo completo usando let y variables, ve Actualizar con variables let.

entero

Opcional. Especifica el lĂ­mite de tiempo en milisegundos para que la operaciĂłn de actualizaciĂłn se ejecute antes de que se agote el tiempo de espera.

booleano

Opcional. Permite que insert omita la validaciĂłn de esquema durante la operaciĂłn. Esto permite insertar documentos que no cumplen con los requisitos de validaciĂłn.

El método devuelve un documento que contiene:

  • Un valor booleano acknowledged en true si la operaciĂłn se ejecutĂł con nivel de confirmaciĂłn de escritura (write concern) o en false si el nivel de confirmaciĂłn de escritura (write concern) estaba deshabilitado

  • matchedCount que contiene el nĂșmero de documentos coincidentes

  • modifiedCount que contiene el nĂșmero de documentos modificados

  • upsertedId que contiene el _id para el documento actualizado o insertado

  • upsertedCount que contiene la cantidad de documentos actualizados o insertados

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 si la operaciĂłn produce una inserciĂłn.

El rol con funcionalidad incorporada readWrite proporciona los privilegios necesarios.

updateMany() encuentra todos los documentos en la colecciĂłn que coinciden con filter y aplica las modificaciones especificadas por el parĂĄmetro update.

updateMany() modifica cada documento individualmente. Cada operaciĂłn de guardar documento es una operaciĂłn atĂłmica, pero updateMany() en su conjunto no es atĂłmica. Si su caso de uso requiere la atomicidad de las escrituras en varios documentos, utilice Transacciones.

Si falla la actualizaciĂłn de un solo documento, se conservan todas las actualizaciones de documentos escritas antes del fallo, pero los documentos restantes que coinciden no se actualizan. Para obtener mĂĄs detalles sobre este comportamiento, consulta Fallos en las actualizaciones mĂșltiples.

Tip

Colecciones fragmentadas para obtener mĂĄs informaciĂłn sobre el comportamiento de updateMany() en las colecciones fragmentadas.

  • updateMany() deberĂ­a usarse solo para operaciones idempotentes.

Si upsert: true y ningĂșn documento coincide con el filter, db.collection.updateMany() crea un nuevo documento basado en los parĂĄmetros filter y update.

Si especifica upsert: true en una colecciĂłn particionada, debe incluir la clave de particiĂłn completa en la filter. Para obtener informaciĂłn sobre el comportamiento de db.collection.updateMany() en colecciones particionadas, consulte colecciĂłn particionada.

Consulta Actualizar varios documentos con inserciĂłn.

Para la especificación de modificación, el método db.collection.updateMany() puede aceptar un documento que solo contenga expresiones de operador de actualizar para ejecutar.

Por ejemplo:

db.collection.updateMany(
<query>,
{ $set: { status: "D" }, $inc: { quantity: 2 } },
...
)

El método db.collection.updateMany() puede aceptar una pipeline de agregación [ <stage1>, <stage2>, ... ] que especifica 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:

db.collection.updateMany(
<query>,
[
{ $set: { status: "Modified", comments: [ "$misc1", "$misc2" ] } },
{ $unset: [ "misc1", "misc2" ] }
]
...
)

Nota

En esta pipeline, $set y $unset son etapas de agregación, a diferencia de los operadores de actualización. Las etapas de agregación $set y $unset añaden nuevos campos a los documentos y no modifican los valores de los campos existentes.

Para obtener mĂĄs informaciĂłn sobre los operadores de actualizaciĂłn, consulta $set y $unset.

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

Si una operación de actualización cambia el tamaño del documento, la operación fallarå.

El método updateMany() estå disponible para colecciones de series de tiempo a partir de MongoDB 5.1.

Los comandos de actualizaciĂłn deben cumplir con los siguientes requisitos:

  • Solo puedes hacer coincidir el valor del campo metaField.

  • Solo puedes modificar el valor del campo metaField.

  • El documento de actualizaciĂłn solo puede contener expresiones de operador de actualizaciĂłn.

  • Su comando para actualizar no debe limitar el nĂșmero de documentos que se deben actualizar. Establezca multi: true o utilice el mĂ©todo updateMany().

  • El comando de actualizaciĂłn no debe establecer inserciĂłn: true.

updateMany() presenta los siguientes comportamientos cuando se utiliza con colecciones fragmentadas:

  • updateMany() las operaciones que incluyen upsert: true deben incluir la clave de fragmentaciĂłn completa en el filter.

  • Si intentas ejecutar updateMany() durante una migraciĂłn de rangos o una actualizaciĂłn de valores de la clave de particiĂłn, la operaciĂłn puede omitir documentos en algunos casos. Para asegurarte de que todos los documentos estĂ©n actualizados, utiliza actualizaciones idempotentes y vuelve a ejecutar el comando hasta que no se apliquen mĂĄs actualizaciones. Para obtener mĂĄs informaciĂłn sobre las actualizaciones idempotentes con updateMany(), consulta Actualizaciones idempotentes.

  • Si updateMany() se ejecuta fuera de una transacciĂłn, las operaciones que apuntan a mĂĄs de una particiĂłn difunden la operaciĂłn a todas las particiones del clĂșster.

  • Si updateMany() se ejecuta dentro de una transacciĂłn, las operaciones que apuntan a mĂĄs de una particiĂłn solo afectan a las particiones relevantes.

updateMany() no es compatible con db.collection.explain().

db.collection.updateMany() 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.

db.collection.updateMany() con upsert: true se puede ejecutar 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.

updateMany() añade una entrada al oplog (registro de operaciones) por cada documento actualizado con éxito. Si no se actualizan documentos, updateMany() no añade entradas al oplog.

Los ejemplos de esta pĂĄgina utilizan datos del conjunto de datos de muestra sample_mflix. Para obtener mĂĄs informaciĂłn sobre cĂłmo cargar este conjunto de datos en la implementaciĂłn autogestionada de MongoDB, consultar Cargar el conjunto de datos de muestra. Si se realizĂł alguna modificaciĂłn en las bases de datos de muestra, es posible que se deban descartar y volver a crear las bases de datos para ejecutar los ejemplos de esta pĂĄgina.

La colecciĂłn sample_mflix.movies contiene pelĂ­culas con calificaciones de IMDB. Esta actualizaciĂłn idempotente realiza las siguientes operaciones:

  • coincide con todas las pelĂ­culas con puntuaciones de IMDB inferiores a 3.0

  • incrementa esas valoraciones en 0.5

  • se configura un campo ratingBoosted en true

db.movies.updateMany(
{ "imdb.rating": { $lt: 3, $type: "number" }, ratingBoosted: { $ne: true } },
{ $inc: { "imdb.rating": 0.5 }, $set: { ratingBoosted: true } }
)

updateMany() modifica cada documento de pelĂ­cula coincidente individualmente. Las actualizaciones individuales del documento son operaciones atĂłmicas, pero la operaciĂłn updateMany() en su conjunto no es atĂłmica.

Si la operaciĂłn no logra actualizar todos los documentos coincidentes, puedes volver a ejecutar de forma segura un comando idempotente hasta que no haya documentos adicionales que coincidan con el filtro especificado. En este caso, el campo imdb.rating de cada documento se actualiza solo una vez, sin importar cuĂĄntas veces se reintente, porque el comando es idempotente.

La colecciĂłn sample_mflix.movies contiene pelĂ­culas con un campo num_mflix_comments.

La siguiente operaciĂłn encuentra todas las pelĂ­culas con mĂĄs de 100 comentarios y agrega una bandera popular a esas pelĂ­culas:

db.movies.updateMany(
{ num_mflix_comments: { $gt: 100 } },
{ $set: { "popular" : true } }
)

db.collection.updateMany() puede utilizar un pipeline de agregaciĂłn para expresar una actualizaciĂłn mĂĄs compleja, como una actualizaciĂłn condicional basada en los valores de campo actuales. Para conocer las etapas de pipeline admitidas, consulte Actualizar con un pipeline de agregaciĂłn.

El siguiente ejemplo utiliza el pipeline de agregaciĂłn para modificar un campo usando los valores de los otros campos en el documento.

Esta pipeline:

  • combina las puntuaciones de los espectadores de IMDB y Tomatoes en un nuevo campo de arreglo combinedRatings

  • establece el campo ratingsUpdated

  • se remueven los campos imdb.rating y tomatoes.viewer.rating originales de todos los documentos coincidentes

db.movies.updateMany(
{ year: { $gte: 2010, $lte: 2019 } },
[
{ $set: {
combinedRatings: [ "$imdb.rating", "$tomatoes.viewer.rating" ],
ratingsUpdated: "$$NOW"
} },
{ $unset: [ "imdb.rating", "tomatoes.viewer.rating" ] }
]
)

Nota

En esta pipeline, $set y $unset son etapas de agregación, a diferencia de los operadores de actualización. Las etapas de agregación $set y $unset añaden nuevos campos a los documentos y no modifican los valores de los campos existentes.

Para obtener mĂĄs informaciĂłn sobre los operadores de actualizaciĂłn, consulta $set y $unset.

Primera etapa

La etapa $set:

  • crea un nuevo campo de arreglo combinedRatings cuyos elementos son el contenido actual de los campos imdb.rating y tomatoes.viewer.rating

  • establece el campo ratingsUpdated al valor de la variable de agregaciĂłn NOW.

Segunda etapa
La etapa $unset remueve los campos imdb.rating y tomatoes.viewer.rating.

Después del comando, las películas coincidentes de la década de los 2010tienen un arreglo combinedRatings con ambos valores de calificación y una marca de tiempo.

Utilizando un pipeline de agregación, se pueden actualizar películas de los años 2010con una puntuación de valoración combinada calculada (promediando las valoraciones de los espectadores de IMDB y Rotten Tomatoes) y asignar una calificación de letra basada en dicha puntuación.

db.movies.updateMany(
{
year: { $gte: 2010, $lte: 2019 },
"imdb.rating": { $exists: true },
"tomatoes.viewer.rating": { $exists: true }
},
[
{ $set: {
combinedScore: { $trunc: [
{ $avg: [ "$imdb.rating", "$tomatoes.viewer.rating" ] },
1
] },
scoreUpdated: "$$NOW"
} },
{ $set: {
ratingGrade: { $switch: {
branches: [
{ case: { $gte: [ "$combinedScore", 8 ] }, then: "A" },
{ case: { $gte: [ "$combinedScore", 6 ] }, then: "B" },
{ case: { $gte: [ "$combinedScore", 4 ] }, then: "C" },
{ case: { $gte: [ "$combinedScore", 2 ] }, then: "D" }
],
default: "F"
} }
} }
]
)

Nota

En esta pipeline, $set y $unset son etapas de agregación, a diferencia de los operadores de actualización. Las etapas de agregación $set y $unset añaden nuevos campos a los documentos y no modifican los valores de los campos existentes.

Para obtener mĂĄs informaciĂłn sobre los operadores de actualizaciĂłn, consulta $set y $unset.

Primera etapa

La etapa $set:

  • calcula un nuevo campo combinedScore basado en el promedio de los campos imdb.rating y tomatoes.viewer.rating. Consulta $avg para obtener mĂĄs informaciĂłn sobre el operador de agregaciĂłn $avg, y $trunc para obtener mĂĄs informaciĂłn sobre el operador de agregaciĂłn de truncamiento $trunc.

  • establece el campo scoreUpdated al valor de la variable de agregaciĂłn NOW.

Segunda etapa
La etapa $set calcula un nuevo campo ratingGrade basado en el campo combinedScore calculado en la etapa anterior. Consulta $switch para obtener mĂĄs informaciĂłn sobre el operador de agregaciĂłn $switch.

Después de la orden, las películas que coinciden tienen una puntuación combinada y una calificación por letras.

La siguiente operación actualiza todas las películas estrenadas después de 2020 y dirigidas por Christopher Nolan:

db.movies.updateMany(
{
year: { $gt: 2020 },
directors: "Christopher Nolan"
},
{ $set: { "upcomingRelease": true } },
{ upsert: true }
)

En este ejemplo, como ningĂșn documento coincide con el filtro, y upsert es true, updateMany inserta un nuevo documento con un _id generado, las condiciones de igualdad del filter y los modificadores update.

Dado un set de réplicas de tres nodos, la siguiente operación especifica un w de majority y un wtimeout de 100:

db.movies.updateMany(
{ title: "The Godfather" },
{ $inc: { num_mflix_comments: 10 }, $set: { trending: true } },
{ w: "majority", wtimeout: 100 }
)

Si el reconocimiento tarda mĂĄs que el lĂ­mite de wtimeout, MongoDB lanza una excepciĂłn.

La siguiente tabla explica los posibles valores de errInfo.writeConcern.provenance:

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

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 siguiente operaciĂłn utiliza una intercalaciĂłn insensible a mayĂșsculas y minĂșsculas para identificar las pelĂ­culas del gĂ©nero "drama" con cualquier combinaciĂłn de minĂșsculas y mayĂșsculas.

db.movies.updateMany(
{ genres: "drama" },
{ $set: { genreNormalized: true } },
{ collation: { locale: "en", strength: 1 } }
)

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

Añade un ratings arreglo a algunas películas combinando sus diversas puntuaciones:

db.movies.updateMany(
{
"imdb.rating": { $exists: true },
"tomatoes.viewer.rating": { $exists: true },
"tomatoes.critic.rating": { $exists: true },
year: { $gte: 2010, $lte: 2015 }
},
[
{ $set: {
ratings: [
{ $multiply: ["$imdb.rating", 10] },
{ $multiply: ["$tomatoes.viewer.rating", 10] },
{ $multiply: ["$tomatoes.critic.rating", 10] }
]
} }
]
)

Para actualizar todas las valuaciones que sean mayores o iguales a 100 en el arreglo ratings, utiliza el operador posicional filtrado $[<identifier>] con la opciĂłn arrayFilters:

db.movies.updateMany(
{ ratings: { $gte: 100 } },
{ $set: { "ratings.$[element]" : 100 } },
{ arrayFilters: [ { "element": { $gte: 100 } } ] }
)

Tras la operaciĂłn, todos los valores de puntuaciĂłn mayores o iguales que 100 en los arreglos ratings se establecen a 100.

Agrega un ratingDetails arreglo a pelĂ­culas con fuentes individuales de clasificaciĂłn:

db.movies.updateMany(
{
"imdb.rating": { $exists: true },
"tomatoes.viewer.rating": { $exists: true },
year: { $gte: 2010, $lte: 2012 }
},
[
{ $set: {
ratingDetails: [
{ source: "imdb", score: "$imdb.rating", weight: 10 },
{ source: "tomatoes_viewer", score: "$tomatoes.viewer.rating", weight: 8 },
{ source: "tomatoes_critic", score: "$tomatoes.critic.rating", weight: 7 }
]
} }
]
)

Para modificar el valor del campo weight a 10 para todos los elementos en el arreglo ratingDetails donde la puntuaciĂłn es mayor o igual a 8, utiliza el operador posicional filtrado $[<identifier>] con arrayFilters:

db.movies.updateMany(
{ ratingDetails: { $exists: true } },
{ $set: { "ratingDetails.$[elem].weight" : 10 } },
{ arrayFilters: [ { "elem.score": { $gte: 8 } } ] }
)

Después de la operación, todas las fuentes de calificación con puntuaciones menores o iguales a 8 tienen su peso configurado en 10.

Cree el siguiente Ă­ndice en la colecciĂłn:

db.movies.createIndex( { rated: 1 } )

La siguiente operaciĂłn de actualizaciĂłn indica explĂ­citamente que se debe usar el Ă­ndice { rated: 1 }:

Nota

Si especifica un Ă­ndice que no existe, la operaciĂłn genera un error.

db.movies.updateMany(
{ "num_mflix_comments": { $lte: 5 }, "rated": "G" },
{ $set: { "familyFriendly": true } },
{ hint: { rated: 1 } }
)

Para ver si se utiliza el Ă­ndice insinuado, ejecuta el pipeline $indexStats :

db.movies.aggregate( [ { $indexStats: { } }, { $sort: { name: 1 } }, { $match: {key: { rated: 1 } } } ] )

Modificado en la 8.1.2 versiĂłn.:

Cuando db.collection.updateMany() se ejecuta en mongos en un clĂșster fragmentado, siempre se reporta un writeConcernError en la respuesta, incluso cuando ocurre uno o mĂĄs errores adicionales. En versiones anteriores, otros errores a veces hacĂ­an que db.collection.updateMany() no informara los errores de nivel de confirmaciĂłn de escritura (write concern).

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.

A partir de MongoDB 7.0, puedes usar la nueva variable de sistema USER_ROLES para devolver los roles de usuario.

El ejemplo en esta sección muestra actualizaciones de campos en una colección que contiene información médica. El ejemplo lee los roles de usuario actuales de la variable de sistema USER_ROLES y solo realiza las actualizaciones si el usuario tiene un rol específico.

Para usar una variable del sistema, agrega $$ al inicio del nombre de la variable. Especifica la variable del sistema USER_ROLES como $$USER_ROLES.

El ejemplo crea a estos usuarios:

  • James con un rol Billing.

  • Michelle con un rol Provider.

Realiza los siguientes pasos para crear los roles, los usuarios y la colecciĂłn:

1

Crea roles llamados Billing y Provider con los privilegios y recursos necesarios.

Ejecuta:

db.createRole( { role: "Billing", privileges: [ { resource: { db: "test",
collection: "medicalView" }, actions: [ "find" ] } ], roles: [ ] } )
db.createRole( { role: "Provider", privileges: [ { resource: { db: "test",
collection: "medicalView" }, actions: [ "find" ] } ], roles: [ ] } )
2

Crea usuarios llamados James y Michelle con los roles requeridos.

db.createUser( {
user: "James",
pwd: "js008",
roles: [
{ role: "Billing", db: "test" }
]
} )
db.createUser( {
user: "Michelle",
pwd: "me009",
roles: [
{ role: "Provider", db: "test" }
]
} )
3

Ejecuta:

db.medical.insertMany( [
{
_id: 0,
patientName: "Jack Jones",
diagnosisCode: "CAS 17",
creditCard: "1234-5678-9012-3456"
},
{
_id: 1,
patientName: "Mary Smith",
diagnosisCode: "ACH 01",
creditCard: "6541-7534-9637-3456"
}
] )

Inicia sesiĂłn como Michelle, quien tiene el rol Provider, y realiza una actualizaciĂłn:

1

Ejecuta:

db.auth( "Michelle", "me009" )
2

Ejecuta:

// Attempt to update many documents
db.medical.updateMany(
// User must have the Provider role to perform the update
{ $expr: { $ne: [ {
$setIntersection: [ [ "Provider" ], "$$USER_ROLES.role" ] }, []
] } },
// Update diagnosisCode
{ $set: { diagnosisCode: "ACH 02"} }
)

El ejemplo anterior utiliza $setIntersection para devolver documentos donde la intersecciĂłn entre la string "Provider" y los roles de usuario de $$USER_ROLES.role no estĂĄ vacĂ­a. Michelle tiene el rol Provider, por lo tanto, se realiza la actualizaciĂłn.

A continuaciĂłn, inicia sesiĂłn como James, que no tiene el rol de Provider, e intenta volver a actualizar:

1

Ejecuta:

db.auth( "James", "js008" )
2

Ejecuta:

// Attempt to update many documents
db.medical.updateMany(
// User must have the Provider role to perform the update
{ $expr: { $ne: [ {
$setIntersection: [ [ "Provider" ], "$$USER_ROLES.role" ] }, []
] } },
// Update diagnosisCode
{ $set: { diagnosisCode: "ACH 02"} }
)

El ejemplo anterior no actualiza ningĂșn documento.