Nota
Desambiguación
Esta página analiza las vistas materializadas on-demand. Para discutir puntos de vista estándar, consulte Vistas.
Para comprender las diferencias entre los tipos de vistas, consulta Comparación con vistas estándar.
Una vista materializada on-demand es el resultado de un pipeline de agregación precomputado que se almacena y se lee desde el disco. Las vistas materializadas on-demand suelen ser el resultado de un $merge o $out etapa.
Comparación con las vistas estándar
MongoDB ofrece dos tipos diferentes de vistas: vistas estándar y vistas materializadas on-demand. Ambos tipos de vistas devuelven los resultados de una canalización de agregación.
Las vistas estándar se calculan cuando lees la vista y no se almacenan en el disco.
Las vistas materializadas on-demand se almacenan y se leen desde el disco. Utilizan una etapa
$mergeo una$outpara actualizar los datos guardados.Nota
Al utilizar
$merge, puede emplear flujos de cambios para monitorear los cambios en la vista materializada. Cuando utilice$out, no podrá observar los cambios en la vista materializada.
Indexes
Las vistas estándar utilizan los índices de la colección subyacente. Como resultado, no puede crear, descartar ni reconstruir índices generales directamente en una vista estándar, ni obtener una lista de índices generales en la vista.
MongoDB almacena los índices de búsqueda y los índices de búsqueda vectorial en disco. En consecuencia, puedes crear índices MongoDB Search e índices MongoDB Vector Search en vistas compatibles que contengan sólo las siguientes etapas:
También puede crear índices directamente en las vistas materializadas on-demand, porque MongoDB almacena esos índices en el disco.
Rendimiento
Las vistas materializadas on-demand ofrecen un mejor rendimiento de lectura que las vistas estándar porque se leen desde el disco en lugar de calcularse como parte de la query. Este beneficio en el rendimiento aumenta en función de la complejidad del pipeline y del tamaño de los datos que se están agregando.
Cree una vista materializada en la interfaz de usuario de MongoDB Atlas
El ejemplo en esta sección utiliza el conjunto de datos de entrenamiento de muestra. Para aprender a cargar el conjunto de datos de muestra en la implementación de MongoDB Atlas, se debe consultar Cargar datos de muestra.
Para crear una vista materializada en la Interfaz de Usuario de MongoDB Atlas, sigue estos pasos:
En la interfaz de usuario de MongoDB Atlas, vaya a Clusters página para tu proyecto.
Si aún no se muestra, seleccione la organización que contiene su proyecto deseado en el menú Organizations de la barra de navegación.
Si aún no se muestra, seleccione su proyecto en el menú Projects de la barra de navegación.
En la barra lateral, haz clic en Clusters en la sección Database.
La página de clústeres se muestra.
Seleccionar una etapa de agregación desde el menú desplegable Select
La etapa de agregación transforma los datos que deseas guardar como una vista. Para obtener más información sobre las etapas de agregación disponibles, consulta Etapas de agregación.
Para este ejemplo, añada un campo nuevo con la etapa $set:
Selecciona
$setdel menú desplegable Select.Añade la siguiente sintaxis al editor de pipeline de agregación para crear una puntuación media de todos los valores de
scoreen el arregloscoresdentro de la coleccióngrades:{ averageScore: { $avg: "$scores.score" } } MongoDB Atlas añade el valor
averageScorea cada documento.
Agregar la etapa $out
Seleccione la etapa
$outdel menú desplegable Select.Agrega la siguiente sintaxis a la canalización de agregación para guardar los resultados del pipeline en la colección
myViewen la base de datossample_training:'myView' Haga clic en Save Documents.
La etapa $out guarda los resultados de la canalización de agregación en la colección especificada, lo que crea la vista. Para obtener más información, consulta $out.
Actualice la lista de colecciones para ver la colección myView.
Para aprender a ejecutar un query sobre la colección de myView en la Interfaz de Usuario de MongoDB Atlas, consulta Ver, filtrar y ordenar documentos en la documentación de MongoDB Atlas.
Ejemplo
El ejemplo utiliza la colección movies del sample_mflix conjunto de datos. Para aprender a cargar datos de muestra, consulte Cargar datos de muestra.
1. Define la vista materializada on-demand
La siguiente función updateMovieStats define una vista materializada movieYearStats que contiene el recuento y la calificación promedio de IMDb de películas por año. La función acepta un parámetro de startYear para actualizar las estadísticas de las películas estrenadas a partir de ese año.
updateMovieStats = function(startYear) { db.movies.aggregate( [ { $match: { year: { $gte: startYear } } }, { $group: { _id: "$year", movieCount: { $sum: 1 }, avgRating: { $avg: "$imdb.rating" } } }, { $merge: { into: "movieYearStats", whenMatched: "replace" } } ] ); };
La fase
$matchfiltra películas para procesar solo aquellas con un valor deyearmayor o igual questartYear.La etapa
$groupagrupa películas poryear. Los documentos que se producen en esta etapa tienen la siguiente forma:{ "_id" : <year>, "movieCount" : <num>, "avgRating" : <num> } La etapa
$mergeguarda la salida en la colecciónmovieYearStats.La etapa compara las en el campo
_idy verifica si cada resultado de agregación coincide con un documento existente:Cuando hay una coincidencia (es decir, un documento con el mismo año ya existe en la colección), la etapa sustituye el documento existente por el documento de los resultados de la agregación.
Cuando no hay una coincidencia, la etapa inserta el documento de los resultados de agregación en la colección (el comportamiento por defecto cuando no se encuentra una coincidencia).
2. Realizar la ejecución inicial
Para la ejecución inicial, pasa un año de inicio para llenar movieYearStats con datos de ese año en adelante:
updateMovieStats(2015);
Después de la ejecución inicial, db.movieYearStats.find().sort( { _id: 1 } ) devuelve documentos como los siguientes:
{ "_id" : 2015, "movieCount" : <num>, "avgRating" : <num> } { "_id" : 2016, "movieCount" : <num>, "avgRating" : <num> } { "_id" : 2017, "movieCount" : <num>, "avgRating" : <num> }
3. Refrescar la vista materializada
Supongamos que se añade una nueva película a la colección movies para 2016:
db.movies.insertOne( { title: "Grove Test Movie", year: 2016, imdb: { rating: 7.5, votes: 500 } } )
Para actualizar movieYearStats desde 2016, ejecuta la función con un startYear de 2016:
updateMovieStats(2016);
El movieYearStats actualizado refleja la nueva película en la colección movies. db.movieYearStats.find().sort( { _id: 1 } ) devoluciones:
{ "_id" : 2015, "movieCount" : <num>, "avgRating" : <num> } { "_id" : 2016, "movieCount" : <num>, "avgRating" : <num> } { "_id" : 2017, "movieCount" : <num>, "avgRating" : <num> }
Información Adicional
La etapa $merge:
Se puede enviar a una colección en la misma base de datos o en una base de datos diferente.
Cree una nueva colección si la colección de salida no existe ya.
Puede incorporar resultados (insertar nuevos documentos, fusionar documentos, reemplazar documentos, mantener documentos existentes, fallar la operación, procesar documentos con un pipeline de actualización personalizado) en una colección existente.
Puede dar salida a una colección fragmentada. La colección de entrada también se puede fragmentar.
Consulta $merge para:
Más información sobre
$mergey las opciones disponiblesEjemplo: Vista materializada on-demand: actualizar/reemplazar datos
Ejemplo: Solo Insertar Nuevos Datos