Puedes crear índices en documentos incrustados en su totalidad. Sin embargo, solo las queries que especifiquen todo el documento incrustado usan el índice. Las queries sobre un campo específico dentro del documento no utilizan el índice.
Acerca de esta tarea
Para utilizar un índice en un documento incrustado, tu query debe especificar todo el documento incrustado. Esto puede causar comportamientos inesperados si tu modelo de esquema cambia y agregas o remueves campos de tu documento indexado.
Cuando consultas documentos incrustados, el orden en que especificas los campos en la query importa. Los documentos incrustados en tu query y el documento devuelto deben coincidir exactamente. Para ver ejemplos de queries en documentos incrustados, consulte query on Embedded/Nested documentos.
Antes de crear un índice en un documento incrustado, considera si deberías indexar campos específicos en ese documento o utilizar un índice comodín para indexar todos los subcampos del documento.
Antes de comenzar
Crear un(a) students colección que contiene los siguientes documentos:
db.students.insertMany( [ { "name": "Alice", "gpa": 3.6, "location": { city: "Sacramento", state: "California" } }, { "name": "Bob", "gpa": 3.2, "location": { city: "Albany", state: "New York" } } ] )
Pasos
Crea un índice en el campo location:
db.students.createIndex( { location: 1 } )
Resultados
La siguiente query utiliza el índice en el campo location:
db.students.find( { location: { city: "Sacramento", state: "California" } } )
Las siguientes consultas no utilizan el índice en el campo location porque consultan campos específicos dentro del documento incrustado:
db.students.find( { "location.city": "Sacramento" } ) db.students.find( { "location.state": "New York" } )
Para que una notación de puntos query utilice un índice, debes crear un índice en el campo incrustado específico que estás consultando, no en todo el objeto incrustado. Para ver un ejemplo, consulte Crear un índice en un campo embebido.
La siguiente query no devuelve resultados porque los campos incrustados en el predicado de la query están especificados en un orden diferente al que aparecen en el documento:
db.students.find( { location: { state: "California", city: "Sacramento" } } )