db.createView()Nota
La siguiente página analiza las vistas. Para discusión de vistas materializadas on-demand, vea
$mergeen su lugar.Crea una vista como resultado de aplicar la pipeline de agregación especificada a la colección o vista de origen. Las vistas actúan como colecciones de solo lectura y se calculan on-demand durante las operaciones de lectura. Debes crear vistas en la misma base de datos que la colección de origen. MongoDB ejecuta operaciones de lectura en vistas como parte del pipeline de agregación subyacente.
La definición de la vista
pipelineno puede incluir la etapa$outo$merge. Si la definición del vista incluye una pipeline anidada (por ejemplo, la definición del vista incluye la etapa$lookupo$facet), esta restricción también se aplica a las pipelines anidadas.
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
db.createView tiene la siguiente sintaxis:
db.createView(<view>, <source>, <pipeline>, <options>)
El método acepta los siguientes parámetros:
Parameter | Tipo | Descripción |
|---|---|---|
| string | El nombre de la vista a crear. |
| string | El nombre de la colección o vista de origen desde la que se creará la vista. El nombre no es el espacio de nombres completo de la colección o vista; es decir, no incluye el nombre de la base de datos e implica la misma base de datos que la vista que se va a crear. Debe crear las vistas en la misma base de datos que la colección de origen. |
| arreglo | Un arreglo que consiste en las etapas del pipeline de agregación. La definición de la vista La definición de la vista es pública; es decir, las operaciones |
| Documento | Opcional. Opciones adicionales para el método. |
El documento de opciones contiene el siguiente campo de opción:
Campo | Tipo | Descripción | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Documento | Opcional. Especifica la intercalación predeterminada para la vista. 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. Si el Si no se especifica ninguna intercalación, la intercalación por defecto de la vista es el intercalador de comparación binaria "simple". Si el La opción de intercalación tiene la siguiente sintaxis: Al especificar la intercalación, el campo Novedad en la versión 3.4. |
El método db.createView() create envuelve la siguiente operación de comando:
db.runCommand( { create: <view>, viewOn: <source>, pipeline: <pipeline>, collation: <collation> } )
Las operaciones que enumeran conjuntos, tales como db.getCollectionInfos() y db.getCollectionNames(), incluyen vistas en sus resultados.
Importante
La definición de la vista es pública; es decir, las operaciones db.getCollectionInfos() y explain en la vista incluirán el pipeline que define la vista. Por lo tanto, evite referirse directamente a campos y valores sensibles en las definiciones de vistas.
Para eliminar una vista, utilice el método en la drop() vista.
Comportamiento
Las vistas muestran el siguiente comportamiento:
Solo lectura
Las vistas son de solo lectura; las operaciones de guardar en vistas darán error.
Las siguientes operaciones de lectura pueden soportar vistas:
Operaciones de uso y ordenación de índices
Las vistas usan los índices de la colección subyacente.
Como los índices están en la colección subyacente, no es posible crear, eliminar ni reconstruir índices en la vista directamente ni obtener una lista de índices en la vista.
A partir de MongoDB 4.4, puedes especificar un ordenamiento
$naturalal ejecutar un comandofinden una vista. Las versiones anteriores de MongoDB no admiten el ordenamiento$naturalen vistas.La canalización de agregación subyacente de la vista está sujeta al límite de memoria de 100 MB para bloquear las operaciones de ordenación y agrupación. A partir de MongoDB 4.4, se puede ejecutar un comando
findconallowDiskUse: trueen la vista para permitir que MongoDB use archivos temporales para bloquear las operaciones de ordenación y agrupación.Antes de MongoDB 4.4, sólo el comando
aggregateaceptaba la opciónallowDiskUse.Tip
Para más información sobre los límites de memoria para la operación de ordenamiento bloqueante, consulta Operaciones de ordenamiento.
Restricciones de proyecciones
find() Las operaciones en vistas no admiten los siguientes operadores de proyección:
Nombre inmutable
No puede cambiar el nombre de vistas.
Ver creación
Las vistas se calculan a demanda durante las operaciones de lectura y MongoDB ejecuta operaciones de lectura en ellas como parte del pipeline de agregación subyacente. Como tal, las vistas no soportan operaciones tales como:
Si la canalización de agregación utilizada para crear la vista suprime el campo
_id, los documentos en la vista no tendrán el campo_id.
Cuando consultas una vista, el:
Los query
filter,projection,sort,skip,limity otras operaciones paradb.collection.find()se convierten en etapas de pipeline de agregación equivalentes.Las etapas del pipeline de agregación convertidas se agregan al final del pipeline de agregación para la vista. Esto no modifica el pipeline subyacente de la vista, que se define cuando se crea la vista.
El optimizador del pipeline de agregación reorganiza las etapas del pipeline de agregación de la vista para mejorar el rendimiento. Esto no cambia los resultados de la consulta.
Vista fragmentada
Las vistas se consideran particionadas si su colección subyacente está particionada. Por lo tanto, no puedes especificar una vista fragmentada para el campo from en las operaciones $lookup y $graphLookup.
Vistas e intercalación
Puede especificar una intercalación por defecto para una vista en el momento que la crea. Si no se especifica ninguna intercalación, la intercalación por defecto de la vista es la intercalación de comparación binaria "simple". Es decir, la vista no hereda la intercalación por defecto de la colección.
Las comparaciones de string en la vista utilizan la intercalación por defecto de la vista. Una operación que intente cambiar o sobrescribir la intercalación por defecto de una vista fallará con un error.
Si crea una vista a partir de otra vista, no puede especificar una intercalación que difiera de la intercalación de la vista de origen.
Si realiza una agregación que implique varias vistas, como con
$lookupo$graphLookup, las vistas deben tener la misma intercalación.
Bloqueo de recursos
Cambiado en la versión 4.2.
db.createView() obtiene un bloqueo exclusivo en la colección o vista especificada durante la duración de la operación. Todas las operaciones posteriores en la colección deben esperar hasta que db.createView() libere el bloqueo. db.createView() normalmente mantiene este bloqueo durante un breve período de tiempo.
Crear una vista requiere obtener un bloqueo exclusivo adicional en la colección system.views de la base de datos. Este bloqueo impide la creación o modificación de vistas en la base de datos hasta que el comando se complete.
Antes de MongoDB 4.2, db.createView() obtenía un bloqueo exclusivo en la base de datos principal, bloqueando todas las operaciones en la base de datos y todas sus colecciones hasta que la operación se completara.
Control de acceso
Si la implementación aplica autenticación:
Para crear una vista, debes tener el privilegio
createCollectionen la base de datos donde se crea la vista. Además, si tienes el privilegiofinden el namespace de la vista que deseas crear, también debes tener el privilegiofinden los siguientes recursos:La colección o vista de origen desde la cual se crea la nueva vista.
Cualquier colección o vista a la que se haga referencia en la canalización de vistas.
Para consultar una vista, debes tener el privilegio
finden el namespace de la vista. No necesitas el privilegiofinden la colección de origen ni en ningún namespace referenciado en la pipeline de vistas.
Un usuario con el rol readWrite incorporado en la base de datos tiene los privilegios necesarios para ejecutar las operaciones mencionadas. Para conceder los permisos necesarios, realiza una de las siguientes acciones:
Crea un usuario con el rol requerido.
Ejemplos
Crear una vista a partir de una única colección
Dada una colección survey con los siguientes documentos:
{ _id: 1, empNumber: "abc123", feedback: { management: 3, environment: 3 }, department: "A" } { _id: 2, empNumber: "xyz987", feedback: { management: 2, environment: 3 }, department: "B" } { _id: 3, empNumber: "ijk555", feedback: { management: 3, environment: 4 }, department: "A" }
La siguiente operación crea una vista managementFeedback con los campos _id, feedback.management y department:
db.createView( "managementFeedback", "survey", [ { $project: { "management": "$feedback.management", department: 1 } } ] )
Consultar una vista
Para consultar la vista, puedes usar db.collection.find() en la vista:
db.managementFeedback.find()
La operación devuelve los siguientes documentos:
{ "_id" : 1, "department" : "A", "management" : 3 } { "_id" : 2, "department" : "B", "management" : 2 } { "_id" : 3, "department" : "A", "management" : 3 }
Realizar pipeline de agregación en una vista.
La siguiente operación realiza una agregación en la vista managementFeedback, usando la $sortByCount para agrupar por el campo department y ordenar en orden descendente por el número de cada departamento distinto:
db.managementFeedback.aggregate([ { $sortByCount: "$department" } ] )
La operación devuelve los siguientes documentos:
{ "_id" : "A", "count" : 2 } { "_id" : "B", "count" : 1 }
Crear una vista a partir de varias colecciones
Dadas las dos colecciones siguientes:
La colección
orders:{ "_id" : 1, "item" : "abc", "price" : NumberDecimal("12.00"), "quantity" : 2 } { "_id" : 2, "item" : "jkl", "price" : NumberDecimal("20.00"), "quantity" : 1 } { "_id" : 3, "item" : "abc", "price" : NumberDecimal("10.95"), "quantity" : 5 } { "_id" : 4, "item" : "xyz", "price" : NumberDecimal("5.95"), "quantity" : 5 } { "_id" : 5, "item" : "xyz", "price" : NumberDecimal("5.95"), "quantity" : 10 } La colección
inventory:{ "_id" : 1, "sku" : "abc", description: "product 1", "instock" : 120 } { "_id" : 2, "sku" : "def", description: "product 2", "instock" : 80 } { "_id" : 3, "sku" : "ijk", description: "product 3", "instock" : 60 } { "_id" : 4, "sku" : "jkl", description: "product 4", "instock" : 70 } { "_id" : 5, "sku" : "xyz", description: "product 5", "instock" : 200 }
El siguiente db.createView() ejemplo especifica una $lookup etapa para crear una vista a partir de la unión de las dos colecciones:
db.createView ( "orderDetails", "orders", [ { $lookup: { from: "inventory", localField: "item", foreignField: "sku", as: "inventory_docs" } }, { $project: { "inventory_docs._id": 0, "inventory_docs.sku": 0 } } ] )
Consultar una vista
Para consultar la vista, puedes usar db.collection.find() en la vista:
db.orderDetails.find()
La operación devuelve los siguientes documentos:
{ "_id" : 1, "item" : "abc", "price" : NumberDecimal("12.00"), "quantity" : 2, "inventory_docs" : [ { "description" : "product 1", "instock" : 120 } ] } { "_id" : 2, "item" : "jkl", "price" : NumberDecimal("20.00"), "quantity" : 1, "inventory_docs" : [ { "description" : "product 4", "instock" : 70 } ] } { "_id" : 3, "item" : "abc", "price" : NumberDecimal("10.95"), "quantity" : 5, "inventory_docs" : [ { "description" : "product 1", "instock" : 120 } ] } { "_id" : 4, "item" : "xyz", "price" : NumberDecimal("5.95"), "quantity" : 5, "inventory_docs" : [ { "description" : "product 5", "instock" : 200 } ] } { "_id" : 5, "item" : "xyz", "price" : NumberDecimal("5.95"), "quantity" : 10, "inventory_docs" : [ { "description" : "product 5", "instock" : 200 } ] }
Realizar pipeline de agregación en una vista.
La siguiente operación realiza una agregación en la orderDetails vista, utilizando para $sortByCount agrupar por el item campo y ordenar en orden descendente por el recuento de cada elemento distinto:
db.orderDetails.aggregate( [ { $sortByCount: "$item" } ] )
La operación devuelve los siguientes documentos:
{ "_id" : "xyz", "count" : 2 } { "_id" : "abc", "count" : 2 } { "_id" : "jkl", "count" : 1 }
Crea una vista con la intercalación por defecto
Dada la colección places con el siguiente documento:
{ _id: 1, category: "café" } { _id: 2, category: "cafe" } { _id: 3, category: "cafE" }
La siguiente operación crea una vista, especificando intercalación a nivel de vista:
db.createView( "placesView", "places", [ { $project: { category: 1 } } ], { collation: { locale: "fr", strength: 1 } } )
Las comparaciones de Strings en la vista utilizan la intercalación por defecto de la vista. Por ejemplo, la siguiente operación utiliza la intercalación de la vista:
db.placesView.count( { category: "cafe" } )
La operación devuelve 3.
Una operación que intente cambiar o sobrescribir la intercalación por defecto de una vista fallará con un error.