Para crear una vista, utilice uno de los siguientes métodos:
Usar
db.createView()
Para crear una vista en la interfaz de usuario de MongoDB Atlas, debe utilizar una vista materializada. Para obtener más información, consulte Crear una vista materializada en la interfaz de usuario de MongoDB Atlas.
Importante
Los nombres de las vistas están incluidos en la salida de la lista de colecciones
Las operaciones que enumeran colecciones, como db.getCollectionInfos() y db.getCollectionNames(), incluyen vistas en sus resultados.
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.
db.createCollection() Sintaxis
db.createCollection( "<viewName>", { "viewOn" : "<source>", "pipeline" : [<pipeline>], "collation" : { <collation> } } )
db.createView() Sintaxis
db.createView( "<viewName>", "<source>", [<pipeline>], { "collation" : { <collation> } } )
Restricciones
Debe crear vistas en la misma base de datos que la colección de origen.
Una definición de vista
pipelineno puede incluir la etapa$outo la$merge. Esta restricción también se aplica a pipelines integradas, como las pipelines usadas en las etapas de$lookupo$facet.No puede renombrar una vista una vez que se creó.
Operaciones no admitidas
Algunas operaciones no están disponibles con las vistas:
El operador
$text, ya que$texten la agregación solo es válido para la primera etapa.Cambio de nombre de una vista.
Para obtener más información, consulte Operaciones admitidas para vistas.
Ejemplo
Este ejemplo rellena una colección con datos de estudiantes y crea una vista para consultar los datos.
Rellene la colección
Cree una colección students para utilizar en este ejemplo:
db.students.insertMany( [ { sID: 22001, name: "Alex", year: 1, score: 4.0 }, { sID: 21001, name: "bernie", year: 2, score: 3.7 }, { sID: 20010, name: "Chris", year: 3, score: 2.5 }, { sID: 22021, name: "Drew", year: 1, score: 3.2 }, { sID: 17301, name: "harley", year: 6, score: 3.1 }, { sID: 21022, name: "Farmer", year: 1, score: 2.2 }, { sID: 20020, name: "george", year: 3, score: 2.8 }, { sID: 18020, name: "Harley", year: 5, score: 2.8 }, ] )
Utilice db.createView() para crear una vista
Utilice db.createView() para crear una vista que esté limitada a estudiantes de primer año:
db.createView( "firstYears", "students", [ { $match: { year: 1 } } ] )
En el ejemplo:
firstYearses el nombre de la nueva vista.studentses la colección en la que se basa la vista.$matches una expresión de agregación que coincide con los estudiantes de primer año en la colecciónstudents.
Consulte la vista
Este ejemplo consulta la vista:
db.firstYears.find({}, { _id: 0 } )
El siguiente resultado solo contiene los documentos con datos sobre estudiantes de primer año. La proyección { _id: 0 } suprime el campo _id en la salida.
[ { sID: 22001, name: 'Alex', year: 1, score: 4 }, { sID: 22021, name: 'Drew', year: 1, score: 3.2 }, { sID: 21022, name: 'Farmer', year: 1, score: 2.2 } ]
Utilice db.createCollection() para crear una vista
El método db.createCollection() le permite crear una colección o una vista con opciones específicas.
El siguiente ejemplo crea una vista graduateStudents. La vista solo contiene documentos seleccionados por la etapa $match. La configuración opcional de intercalación determina el orden en la clasificación.
db.createCollection( "graduateStudents", { viewOn: "students", pipeline: [ { $match: { year: { $gt: 4 } } } ], collation: { locale: "en", caseFirst: "upper" } } )
Nota
Comportamiento de la 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.
Consulte la vista
El siguiente ejemplo consulta la vista. La etapa $unset elimina el campo _id de la salida para mayor claridad.
db.graduateStudents.aggregate( [ { $sort: { name: 1 } }, { $unset: [ "_id" ] } ] )
Cuando se ordena la salida, la etapa $sort utiliza el orden de intercalación para clasificar las letras mayúsculas antes que las minúsculas.
[ { sID: 18020, name: 'Harley', year: 5, score: 2.8 }, { sID: 17301, name: 'harley', year: 6, score: 3.1 } ]
Comportamiento
Las siguientes secciones describen los comportamientos de la creación de vistas y los queries.
Optimizaciones de agregación
Cuando 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.MongoDB agrega el query del cliente a la pipeline subyacente y le devuelve los resultados de esa pipeline combinada. MongoDB puede aplicar optimizaciones de pipeline de agregación a la pipeline combinada.
El optimizador de la canalización de agregación reestructura las etapas de la canalización de agregación de vistas para mejorar el rendimiento. La optimización no modifica los resultados de la consulta.
Bloqueo de recursos
db.createView() obtiene un bloqueo exclusivo en la colección o vista especificada durante toda 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 por poco 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.