Docs Menu
Docs Home
/ /
Databases

db.createView()

db.createView()

Nota

En la página siguiente se describen las vistas. Para obtener información sobre las vistas materializadas bajo demanda, consulte $merge en 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 pipeline no puede incluir $out las etapas ni. Si la definición de vista incluye $merge $lookup $facet una 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.

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.

db.createView tiene la siguiente sintaxis:

db.createView(<view>, <source>, <pipeline>, <options>)

El método acepta los siguientes parámetros:

Parameter
Tipo
Descripción

view

string

El nombre de la vista a crear.

source

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.

pipeline

arreglo

Un arreglo que consiste en las etapas del pipeline de agregación. db.createView() crea la vista aplicando el pipeline especificado a la colección o vista source.

La definición de vista pipeline no puede incluir $out las etapas ni. Si la definición de vista incluye $merge $lookup $facet una 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.

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.

options

Documento

Opcional. Opciones adicionales para el método.

El documento de opciones contiene el siguiente campo de opción:

Campo
Tipo
Descripción

collation

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 source subyacente es una colección, la vista no hereda la configuración de intercalación de la colección.

Si no se especifica ninguna intercalación, la intercalación predeterminada de la vista es el intercalador de comparación binaria "simple".

Si el source subyacente es otra vista, la vista debe especificar las mismas configuraciones de intercalación.

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.

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.

Las vistas muestran el siguiente comportamiento:

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:

  • 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 $natural al ejecutar un comando find en una vista. Las versiones anteriores de MongoDB no admiten el ordenamiento $natural en 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 find con allowDiskUse: true en 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 aggregate la allowDiskUse opció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.

find() Las operaciones en las vistas no admiten los siguientes operadores de proyección:

No puede cambiar el nombre de vistas.

  • 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, limit y otras operaciones para db.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.

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.

  • 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 $lookup o $graphLookup, las vistas deben tener la misma intercalación.

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.

Si la implementación aplica autenticación:

  • Para crear una vista, debes tener el privilegio createCollection en la base de datos donde se crea la vista. Además, si tienes el privilegio find en el namespace de la vista que deseas crear, también debes tener el privilegio find en 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 find en el namespace de la vista. No necesitas el privilegio find en 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:

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

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 }

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 }

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

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

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 }

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.

Volver

db.createCollection

En esta página