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
/ /
Databases

db.createView()

db.createView()

Nota

La siguiente página analiza las vistas. Para discusión de vistas materializadas on-demand, vea $merge en 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 pipeline no puede incluir la etapa $out o $merge. Si la definición del vista incluye una pipeline anidada (por ejemplo, la definición del vista incluye la etapa $lookup o $facet), esta restricción también se aplica a las pipelines 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 la vista pipeline no puede incluir la etapa $out o $merge. Si la definición del vista incluye una pipeline anidada (por ejemplo, la definición del vista incluye la etapa $lookup o $facet), esta restricción también se aplica a las pipelines 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 por defecto de la vista es el intercalador de comparación binaria "simple".

Si el source subyacente es otra vista, la vista debe especificar la misma configuración de intercalado.

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.

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.

Las vistas muestran el siguiente comportamiento:

Las vistas son de solo lectura; las operaciones de guardar en vistas darán error.

Las siguientes operaciones de lectura pueden soportar vistas:

  • 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 $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 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 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, sólo el comando aggregate aceptaba la opción allowDiskUse.

    Tip

    Para más información sobre los límites de memoria para la operación de ordenamiento bloqueante, consulta Operaciones de ordenamiento.

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

No puede cambiar el nombre de vistas.

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

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.

  • 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 la operación se completara.

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

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

Volver

db.createCollection

En esta página