MongoDB con controladores
DefiniciĂłn
Compatibilidad
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.
Sintaxis
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> } )
ParĂĄmetros
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 Especifica un documento vacĂo | |||||||||||||||||||
documento o pipeline | Las modificaciones que se deben aplicar puede ser una de las siguientes:
Para actualizar con un documento de reemplazo, consulta | |||||||||||||||||||
| booleano | Opcional. Cuando
Para evitar mĂșltiples inserciones, asegĂșrate de que los campos de Se establece por defecto en | ||||||||||||||||||
| 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. | ||||||||||||||||||
| 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: Al especificar la intercalaciĂłn, el campo Si no se especifica la intercalaciĂłn, pero la colecciĂłn tiene una intercalaciĂłn por defecto (ver Si no se especifica ninguna intercalaciĂłn para la colecciĂłn o para las operaciones, MongoDB utiliza la comparaciĂłn binaria simple usada en versiones anteriores para las comparaciones de strings. No puedes especificar varias intercalaciones para una operaciĂłn. Por ejemplo, no puedes especificar diferentes intercalaciones por campo, o si realizas una bĂșsqueda con un ordenamiento, no puedes usar una intercalaciĂłn para la bĂșsqueda y otra para el ordenamiento. | ||||||||||||||||||
| arreglo | Opcional. Un arreglo de documentos de filtro que 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 El Puedes incluir el mismo identificador varias veces en el documento de actualizaciĂłn; sin embargo, para cada identificador distinto ( Sin embargo, se pueden especificar condiciones compuestas sobre el mismo identificador en un Ășnico documento de filtro, como en los siguientes ejemplos: Para ver ejemplos, se puede consultar Especificar | ||||||||||||||||||
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 | |||||||||||||||||||
Documento | Opcional. Especifica un documento que contiene una lista de variables. Esto le permite mejorar la legibilidad de los comandos al separar las variables del texto de la query. La sintaxis del documento es: La variable se establece en el valor devuelto por la expresiĂłn y no puede modificarse posteriormente. Para acceder al valor de una variable en el comando, se debe usar el prefijo de doble signo de dĂłlar ( Para usar una variable para los resultados del filtro, debes acceder a la variable dentro del operador Para un ejemplo completo usando | |||||||||||||||||||
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 |
Devuelve
El método devuelve un documento que contiene:
Un valor booleano
acknowledgedentruesi la operaciĂłn se ejecutĂł con nivel de confirmaciĂłn de escritura (write concern) o enfalsesi el nivel de confirmaciĂłn de escritura (write concern) estaba deshabilitadomatchedCountque contiene el nĂșmero de documentos coincidentesmodifiedCountque contiene el nĂșmero de documentos modificadosupsertedIdque contiene el_idpara el documento actualizado o insertadoupsertedCountque contiene la cantidad de documentos actualizados o insertados
Control de acceso
En las implementaciones que se ejecutan con authorization, el usuario debe tener acceso que incluya los siguientes privilegios:
updateacciĂłn en las colecciones especificadas.findacciĂłn en las colecciones especificadas.insertacciĂłn en las colecciones especificadas si la operaciĂłn produce una inserciĂłn.
El rol con funcionalidad incorporada readWrite proporciona los privilegios necesarios.
Comportamiento
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.
Limitaciones
updateMany()deberĂa usarse solo para operaciones idempotentes.
InserciĂłn
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.
Actualiza con un documento de actualizaciĂłn de expresiones de operador
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 } }, ... )
Actualiza con un pipeline de agregaciĂłn
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:
$addFieldsy su alias$set$replaceRooty su alias$replaceWith
El uso de un pipeline de agregaciĂłn permite una instrucciĂłn de actualizaciĂłn mĂĄs expresiva, como expresar actualizaciones condicionales basadas en los valores actuales de los campos o actualizar un campo con el valor de otros campos.
Por ejemplo:
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.
Colecciones con tamaño fijo
Si una operación de actualización cambia el tamaño del documento, la operación fallarå.
Colecciones de series de tiempo
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: trueo utilice el métodoupdateMany().El comando de actualización no debe establecer inserción: true.
Colecciones fragmentadas
updateMany() presenta los siguientes comportamientos cuando se utiliza con colecciones fragmentadas:
updateMany()las operaciones que incluyenupsert: truedeben incluir la clave de fragmentaciĂłn completa en elfilter.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 conupdateMany(), 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.
Explicabilidad
updateMany() no es compatible con db.collection.explain().
Transacciones
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.
Inserta dentro de transacciones
Puedes crear colecciones e Ăndices dentro de una transacciĂłn distribuida si la transacciĂłn no es una transacciĂłn de escritura entre particiones.
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.
Nivel de confirmaciĂłn de escritura y transacciones
No establezcas explĂcitamente el nivel de confirmaciĂłn de escritura para la operaciĂłn si se ejecuta en una transacciĂłn. Para usar el nivel de confirmaciĂłn de escritura con transacciones, consulta Transacciones y nivel de confirmaciĂłn de escritura.
Entradas de OpLog
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.
Ejemplos
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.
Idempotent Updates
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
ratingBoostedentrue
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.
Actualiza varios documentos
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 } } )
Actualiza con el pipeline de agregaciĂłn
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.
Ejemplo 1: actualizaciĂłn con el pipeline de agregaciĂłn mediante campos existentes
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
combinedRatingsestablece el campo
ratingsUpdatedse remueven los campos
imdb.ratingytomatoes.viewer.ratingoriginales 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
combinedRatingscuyos elementos son el contenido actual de los camposimdb.ratingytomatoes.viewer.ratingestablece el campo
ratingsUpdatedal valor de la variable de agregaciĂłnNOW.
- Segunda etapa
- La etapa
$unsetremueve los camposimdb.ratingytomatoes.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.
Ejemplo 2: actualizaciĂłn con un pipeline de agregaciĂłn mediante los campos existentes de forma condicional
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:establece el campo
scoreUpdatedal valor de la variable de agregaciĂłnNOW.
- Segunda etapa
- La etapa
$setcalcula un nuevo camporatingGradebasado en el campocombinedScorecalculado en la etapa anterior. Consulta$switchpara 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.
Actualiza mĂșltiples documentos con inserciĂłn
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.
Actualizar con nivel de confirmaciĂłn de escritura (Write Concern)
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 |
|---|---|
| El nivel de confirmaciĂłn de escritura se especificĂł en la aplicaciĂłn. |
| El nivel de confirmaciĂłn de escritura se originĂł a partir de un valor por defecto personalizado. Vea |
| El nivel de confirmaciĂłn de escritura se originĂł en el campo |
| 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). |
Especificar la intercalaciĂłn
La intercalaciĂłn permite a los usuarios especificar reglas propias del lenguaje para la comparaciĂłn de strings, como reglas para el uso de mayĂșsculas y minĂșsculas y marcas de acento.
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 } } )
Especifica arrayFilters para una operaciĂłn de actualizaciĂłn de arreglos
Al actualizar el campo de un arreglo, puede especificar arrayFilters que determinen qué elementos del arreglo actualizar.
Se deben actualizar los elementos que coinciden con los criterios arrayFilters
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.
Actualiza elementos especĂficos de un arreglo de documentos
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.
Especifica hint para las operaciones de actualizaciĂłn
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 } } } ] )
Errores de nivel de confirmaciĂłn de escritura (write concern) en clĂșsteres particionados
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.
Roles de usuario y actualizaciones de documentos
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:
Jamescon un rolBilling.Michellecon un rolProvider.
Realiza los siguientes pasos para crear los roles, los usuarios y la colecciĂłn:
Crea los roles
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: [ ] } )
Inicia sesiĂłn como Michelle, quien tiene el rol Provider, y realiza una actualizaciĂłn:
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:
Intento de realizar una actualizaciĂłn
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.