db.createView()Nota
En la página siguiente se describen las vistas. Para obtener información sobre las vistas materializadas bajo demanda, consulte
$mergeen su lugar.Crea una vista como resultado de aplicar la canalización de agregación especificada a la colección o vista de origen. Las vistas actúan como colecciones de solo lectura y se calculan bajo demanda durante las operaciones de lectura. Debe crear las vistas en la misma base de datos que la colección de origen. MongoDB ejecuta operaciones de lectura en las vistas como parte de la canalización de agregación subyacente.
La definición de vista
pipelineno puede incluir$outlas etapas ni. Si la definición de vista incluye$merge$lookup$facetuna canalización anidada (por ejemplo, la definición de vista incluye las etapas o), esta restricción también se aplica a las canalizaciones 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 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 predeterminada 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 Nuevo 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 colecciones, como db.getCollectionInfos() db.getCollectionNames()y, incluyen vistas en sus salidas.
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 sólo lectura; las operaciones de escritura en las vistas generarán errores.
Las siguientes operaciones de lectura pueden admitir vistas:
Operaciones de uso y ordenación de índices
Las vistas utilizan 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 100 límite de memoria de megabytes para bloquear las operaciones de ordenación y agrupación. A partir de MongoDB,4.4 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 solo el comando aceptaba
aggregatelaallowDiskUseopción.Tip
Para obtener más información sobre cómo bloquear los límites de memoria de las operaciones de clasificación, consulte Operaciones de clasificación.
Restricciones de proyecciones
find() Las operaciones en las 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 bajo demanda durante las operaciones de lectura, y MongoDB ejecuta operaciones de lectura en las vistas como parte del flujo de trabajo de agregación subyacente. Por lo tanto, las vistas no admiten operaciones 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 se consulta una vista,:
Los query
filter,projection,sort,skip,limity otras operaciones paradb.collection.find()se convierten en etapas de pipeline de agregación equivalentes.Las etapas convertidas del pipeline de agregación se añaden al final del pipeline de agregación de la vista. Esto no modifica el pipeline subyacente de la vista, que se configura al crearla.
El optimizador de canalización de agregación reestructura las etapas de la canalización de agregación de vistas para mejorar el rendimiento. Esto no altera los resultados de la consulta.
Vista fragmentada
Las vistas se consideran fragmentadas si su colección subyacente también lo está. Por lo tanto, no se puede especificar una vista fragmentada para el from campo en $lookup las operaciones $graphLookup y.
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 se completaba la operación.
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 ejemplo db.createView() $lookup especifica una 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 la intercalación en el 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.