Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

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

MongoDB con controladores

Esta página documenta a mongosh . Para ver el método equivalente en un driver de MongoDB, se debe consultar la página correspondiente al lenguaje de programación:

C#Java SyncNode.jsPyMongoCC++GoJava RSKotlin CoroutineKotlin SyncPHPMongoidRustScala
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() toma 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() puede:

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

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

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 especificas upsert: true en una colección fragmentada, debe incluir la clave de partición completa en la filter. Para obtener información sobre el comportamiento adicional de db.collection.updateMany(), consulta Colecciones fragmentadas.

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 contiene expresiones de Operadores de actualización 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. La 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.

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

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

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

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

  • Coincide con todas las películas con una calificación de IMDB inferior a 3.0.

  • incrementa esas calificaciones en 0.5

  • establece un campo ratingBoosted a true

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

updateMany() modifica individualmente los documentos de película coincidentes. Las actualizaciones de documentos individuales 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 } }
)

El db.collection.updateMany() puede utilizar un pipeline de agregación para actualizar. La 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.

El siguiente ejemplo utiliza la canalización de agregación para modificar un campo utilizando los valores de los demás campos del documento.

Esta pipeline:

  • Combina las calificaciones de los espectadores de IMDB y Tomatoes en un nuevo campo de matriz combinedRatings.

  • establece el campo ratingsUpdated

  • elimina los campos imdb.rating y tomatoes.viewer.rating originales para 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 matriz 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 los 2010tienen una matriz combinedRatings con valores de calificación y una marca de tiempo.

Mediante una canalización de agregación, puedes actualizar las películas desde el estado 2010con una puntuación de calificación combinada calculada (promediando las calificaciones de los espectadores de IMDB y Tomatoes) y asignar una calificación con letras basada en esa 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 imdb.rating tomatoes.viewer.rating campos y. Consulte $avg para obtener más información sobre el operador $avg de agregación y para $trunc obtener más información sobre el $trunc operador de agregación de truncamiento.

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

Tras recibir la orden, las películas coincidentes obtienen una puntuación combinada y una calificación con letra.

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

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

En este ejemplo, dado que ningún documento coincide con el filtro, y upsert truees, updateMany() inserta un nuevo documento con un generado,_id así como las condiciones de igualdad de filter los update modificadores y.

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 la confirmación tarda más que el límite 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 que no distingue entre mayúsculas y minúsculas para emparejar películas del género "drama" con cualquier combinación de mayúsculas y minú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.

Agregue una matriz ratings a algunas películas combinando sus diferentes puntuaciones de calificación:

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 calificaciones que sean mayores o iguales a 100 en la ratings matriz, utilice el operador posicional filtrado con $[<identifier>] la arrayFilters opción:

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

Después de la operación, todos los valores de calificación mayores o iguales a 100 en las matrices ratings se establecen en 100.

Agregue una matriz ratingDetails a las películas con fuentes de calificación individuales:

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 weight campo a 10 para todos los elementos en la ratingDetails matriz donde la puntuación sea mayor o igual 8 que, utilice el operador posicional filtrado $[<identifier>] arrayFilterscon:

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

Cambiado en la versión 8.1.2.

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

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.

Volver

db.collection.update

En esta página