Docs Menu
Docs Home
/ /

Vistas materializadas on-demand

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.

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 $merge o una $out para 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.

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.

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.

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:

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

  2. Si aún no se muestra, seleccione su proyecto en el menú Projects de la barra de navegación.

  3. En la barra lateral, haz clic en Clusters en la sección Database.

    La página de clústeres se muestra.

2
  1. Para el clúster que contiene los datos de muestra, haz clic en Browse Collections.

  2. En el panel de navegación izquierdo, seleccione la base de datos sample_training.

  3. Seleccione la colección grades.

3
4
5

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:

  1. Selecciona $set del menú desplegable Select.

  2. Añade la siguiente sintaxis al editor de pipeline de agregación para crear una puntuación media de todos los valores de score en el arreglo scores dentro de la colección grades:

    {
    averageScore: { $avg: "$scores.score" }
    }

    MongoDB Atlas añade el valor averageScore a cada documento.

6
7
  1. Seleccione la etapa $out del menú desplegable Select.

  2. Agrega la siguiente sintaxis a la canalización de agregación para guardar los resultados del pipeline en la colección myView en la base de datos sample_training:

    'myView'
  3. 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.

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.

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 $match filtra películas para procesar solo aquellas con un valor de year mayor o igual que startYear.

  • La etapa $group agrupa películas por year. Los documentos que se producen en esta etapa tienen la siguiente forma:

    { "_id" : <year>, "movieCount" : <num>, "avgRating" : <num> }
  • La etapa $merge guarda la salida en la colección movieYearStats.

    La etapa compara las en el campo _id y verifica si cada resultado de agregación coincide con un documento existente:

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

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

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:

Volver

Operaciones compatibles

En esta página