Puedes crear un índice de búsqueda de MongoDB en una Vista para transformar documentos y colecciones. Esto le permite indexar parcialmente una colección, admitir tipos de datos o modelos de datos incompatibles, y más.
The following examples use the sample_mflix and sample_airbnb sample databases.
Nota
Desambiguación
Esta página discute las vistas estándar. Para aprender más sobre las vistas materializadas on-demand, consulte Vistas materializadas On-demand.
Para aprender sobre las diferencias entre los tipos de vistas, se puede consultar Comparación con vistas materializadas on-demand.
Requisitos
Debes usar MongoDB 8.0 o superior.
En MongoDB v8.0+:
Utiliza la interfaz de usuario de Atlas o la API de administración de Atlas para crear índices de MongoDB Search en las vistas.
Ejecuta las queries de MongoDB Search en la colección de origen. Hace referencia al índice de MongoDB Search que se creó en la Vista. Estas queries devuelven los documentos originales tal como aparecen en la colección de origen.
En MongoDB v8.1+, también puedes:
Use
mongoshand Driver methods,db.collection.createSearchIndex(),db.collection.updateSearchIndex(),db.collection.dropSearchIndex(), and$listSearchIndexesto create and manage MongoDB Search indexes on Views.Ejecutar las consultas de MongoDB Search contra la vista.
En MongoDB v8.2+, también puedes:
Use
$rankFusionin aggregation pipelines on Views.Query Views that include sharded sub-pipelines with
$lookupand$unionWith.
To edit a View, you must have a User Admin role and use the collMod database command.
Limitaciones
Los nombres de los índices deben ser únicos en toda una colección de fuente y todas sus vistas.
MongoDB Search doesn't support view definitions with operators that produce dynamic results, such as the $$USER_ROLES system variable and the
$randaggregation operator.MongoDB Search queries devuelven los documentos originales tal como aparecen en la colección de origen.
- Para recuperar el documento transformado, use la
storedSourceopción.
Permisos requeridos
To create a View, your role must have the createCollection privilege.
Ejemplos
Los siguientes ejemplos muestran cómo crear una vista, crear un índice parcial y ejecutar queries que utilizan el índice. Los ejemplos consultan el índice ejecutando el comando .aggregate contra la colección de origen o la vista. MongoDB Search admite queries en vistas directamente solo en MongoDB v8.1 o posterior.
Puede filtrar documentos para indexar parcialmente una colección. El siguiente ejemplo crea una Vista sobre la colección sample_mflix.movies para que puedas buscar únicamente películas estrenadas después del 1 de enero de 2000.
El siguiente ejemplo permite buscar en la colección sample_airbnb.listingsAndReviews alojamientos basándose en un nuevo campo totalPrice, que es la suma de los campos price y cleaningFee. Además, dado que MongoDB Search no admite los tipos Decimal128, los valores deben transformarse a Double.
To index fields matching a naming pattern, use a View to transform your data so that the fields to index are nested in a sub-document. This enables you to use dynamic mappings for the sub-document path so that you can automatically search all new fields with the suffix _type, without any changes to your index definition.
The following View named listings_SearchableTypes only matches field names that end with _type in the sample_airbnb.listingsAndReviews collection. Specifically, the $set stage adds a new field named searchable_types, which contains the filtered fields with the term _type in the field name. The $arrayToObject contains the filter input (entire document) and condition (regex match for _type).
Para realizar una faceta en tipos de campo no compatibles, como booleano, ObjectId o UUID, recomendamos transformar los valores al tipo string.
El siguiente ejemplo crea una vista en el namespace sample_airbnb.listingsAndReviews para que puedas facetar en el campo de tipo boolean host.host_is_superhost y en el campo de tipo objectID _id.
Para buscar en campos de tipo decimal128, recomendamos convertir los valores a double.
En el siguiente ejemplo se crea una vista en el namespace sample_airbnb.listingsAndReviews para añadir un campo denominado totalPrice, que contiene la suma del campo price y el campo cleaning_fee después de convertir los valores de estos campos a double.
Editar una Vista
El siguiente ejemplo actualiza la vista movies_ReleasedAfter2000 de MongoDB para las películas anteriores a 2000.
db.runCommand( { collMod: "movies_ReleasedAfter2000", viewOn: "movies", "pipeline": [ { $match: { $expr: { $lt: [ "$released", ISODate("2000-01-01T00") ] } } } ] } )
Después de ejecutar este comando, MongoDB Search detecta automáticamente el cambio en la definición de la Vista y realiza la reindexación sin tiempo de inactividad.
Devolver las pipelines para una vista
El siguiente ejemplo retorna las pipelines en la Vista movies_ReleasedAfter2000.
db.getCollectionInfos({ name: "movies_ReleasedAfter2000" })[0].options.pipeline
[ { '$match': { '$expr': { '$gt': [ '$released', ISODate('2000-01-01T00:00:00.000Z') ] } } } ]
Consideraciones sobre el rendimiento
Highly complex view transformations can increase indexing and query time. This is because the mongod must read the view definition when it filters and transforms the oplog entries during indexing (initial sync and steady state replication), and when it applies those transformations to the returned documents at query-time.
Considera crear una vista materializada para evitar una carga extra de replicación en Atlas. También puedes query la colección de origen directamente para evitar la latencia de queries que se produce con la transformación de la vista.
Solucionar problemas
Los índices cambian a FAILED
Los índices cambian al estado FAILED en los siguientes escenarios:
Creas un índice en una vista que es incompatible con MongoDB Search.
Edita una vista de una manera que no cumple con los requisitos de compatibilidad de MongoDB Search.
Remover o cambiar la colección fuente de una vista.
Por ejemplo, si se crea una vista sobre otra vista y se cambia la fuente de la vista superior a otra colección.
Nota
Esta limitación también se aplica si una Vista es descendiente de otras Vistas. Por ejemplo, no se puede cambiar o remover la colección de origen de la que provienen todos los descendientes.
Los índices cambian a STALE
Los índices cambian al estado STALE en los siguientes escenarios:
Advertencia
Si el pipeline de agregación definido en tu Vista es incompatible con los documentos de la colección, la replicación de búsqueda falla. Por ejemplo, si una expresión $toDouble opera sobre un campo del documento que contiene un arreglo, la replicación falla. Asegúrate de que tu Vista funcione con todos los documentos de la colección sin errores.
Si la definición de la vista provoca un fallo de agregación mientras un índice está
READY, el índice se convierte enSTALE. El índice volverá aREADYdespués de que resuelvas el documento o cambies la definición de vista para que no falle más. CuandoSTALE, el índice sigue siendo consultable. Si el índice se cae del oplog, se activa una reconstrucción del índice.Si la definición de la Vista provoca un fallo en el pipeline de agregación mientras el índice es
BUILDING, la creación de índices queda atascada hasta que soluciones el documento. El índice volverá aREADYdespués de que resuelvas el documento o cambies la definición de vista para que no falle más.
Puedes ver los estados de los índices en la Interfaz de Usuario de Atlas en la página de Detalles del estado del índice.
Error: $search solo es válido como la primera etapa en un pipeline
Este error aparece cuando se hace una query a una vista usando una versión de MongoDB anterior a 8.1.
Si utiliza una versión de MongoDB anterior a la 8.0, le recomendamos que actualice a la 8.1+ para query la vista directamente. Puedes actualizar a 8.0 para query la colección de origen.
Si usas MongoDB 8.0, deberás query el índice de visualización en la colección de origen. Por ejemplo, ejecuta
.aggregate()en la colección en lugar de en la vista.
Proceso de índice
Cuando se crea un índice de MongoDB Search en una vista, el proceso mongot realiza las mismas tareas que cuando se crea un índice de MongoDB Search en una colección normal. El proceso mongot:
Crea índices de MongoDB Search basado en las reglas en la definición del índice para la colección.
Supervisa los flujos de cambio para el estado actual de los documentos e índices de las colecciones para las que hayas definido los índices MongoDB Search.
Procesa consultas de búsqueda de MongoDB Search y devuelve los IDs de los documentos y otros metadatos de búsqueda para los documentos coincidentes a
mongod, que luego realiza una búsqueda completa de documentos y devuelve los resultados al cliente.
Cuando creas un índice de MongoDB Search en una vista, la definición de la vista se aplica durante el paso 1 y el 2, y los documentos transformados se indexan según la definición del índice de búsqueda, y luego se almacenan en disco.
Obtén más información
Para obtener más información sobre Vistas, consulte Vistas.
To create a MongoDB Vector Search index on a View, see Use Views with MongoDB Vector Search.