Los índices multiclave recopilan y ordenan datos de campos que contienen valores de arreglo. Los índices multiclave mejoran el rendimiento de las queries en campos de arreglos.
Cuando creas un índice en un campo que contiene un valor de arreglo, MongoDB configura ese índice como un índice multiclave automáticamente.
MongoDB puede crear índices multiclave sobre arreglos que contienen tanto valores escalares (por ejemplo, strings y números) como documentos incrustados. Si un arreglo contiene múltiples instancias del mismo valor, el índice solo incluye una entrada para ese valor.
Para crear un índice de múltiples claves, utilice el siguiente prototipo:
db.<collection>.createIndex( { <arrayField>: <sortOrder> } )
Esta imagen muestra un índice multiclave en el addr.zip campo:
Puede crear y gestionar índices multiclave en la interfaz de usuario para despliegues alojados en MongoDB Atlas.
Casos de uso
Si la aplicación realiza queries frecuentemente a un campo que contiene un valor de matriz arreglo, un índice multiclave mejora el rendimiento de esas queries.
Por ejemplo, los documentos en una colección movies contienen un campo genres: un arreglo de géneros asociados con cada película. Con frecuencia realizas query sobre películas que tienen géneros específicos, como encontrar todas las películas que son tanto Drama como Action.
Puedes crear un índice en el campo genres para mejorar el rendimiento de esta query. Como genres contiene un valor de arreglo, MongoDB almacena el índice como un índice multiclave.
Empezar
Para crear un índice multiclave, consulta:
Detalles
Esta sección describe los detalles técnicos y las limitaciones de los índices multiclave.
Los ejemplos de esta página utilizan datos del conjunto de datos de ejemplo sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en su implementación de MongoDB autogestionada, consulte Cargar el conjunto de datos de ejemplo. Si realizó alguna modificación en las bases de datos de ejemplo, es posible que deba eliminarlas y volver a crearlas para ejecutar los ejemplos de esta página.
Límites del índice
Los límites de un escaneo de índice definen las partes de un índice para buscar durante una query. El cálculo de los límites del índice multiclave sigue reglas especiales. Para obtener más detalles, consulta Límites del índice multiclave.
Unique Multikey Indexes
En un índice multiclave único, un documento puede tener elementos de arreglo que resulten en valores de clave de índice repetidos, siempre que los valores de clave de índice de ese documento no dupliquen los de otro.
Para aprender más y ver un ejemplo de este comportamiento, consulta Restricción única en documentos separados.
Índices compuestos multiclave
En un índice multiclave compuesto, cada documento indexado puede tener, como máximo, un campo indexado cuyo valor sea un arreglo. Específicamente:
No puedes crear un índice multiclave compuesto si más de un campo en la especificación del índice es un arreglo.
Si ya existe un índice multiclave compuesto, no puedes insertar un documento que violaría esta restricción.
Por ejemplo, puedes crear un índice multiclave compuesto { genres: 1, year: 1
} en la colección movies porque para cada documento, solo uno de los campos indexados por el índice multiclave compuesto es un arreglo. Ningún documento contiene valores de arreglo para ambos campos genres y year.
Sin embargo, después de crear el índice compuesto multiclave, si intentas insertar un documento en que tanto los campos genres como year son arreglos, la inserción falla.
Clasificación
Cuando ordenas según un campo de arreglo que está indexado con un índice multiclave, el plan del query incluye una etapa de ordenación en memoria, a menos que ambas de las siguientes condiciones sean verdaderas:
Los límites del índice para todos los campos de ordenación son
[MinKey, MaxKey].Ningún límite para ningún campo indexado con múltiples claves tiene el mismo prefijo de ruta que el patrón de ordenación.
Claves de partición
No puedes especificar un índice multiclave como un índice de clave de partición.
Sin embargo, si el índice de clave de partición es un prefijo de un índice compuesto, el índice compuesto puede convertirse en un índice multiclave compuesto si una de las claves finales (que no son parte de la clave de partición) indexa un arreglo.
Índices encriptados
Los índices encriptados no pueden ser multiclave.
Consultas cubiertas
Los índices multiclave pueden cubrir queries cuando se cumplen estas condiciones:
El query no devuelve el campo de arreglo (lo que significa que el arreglo no está incluido en la proyección del query). Esto significa que, para cubrir un query, el índice multiclave debe ser compuesto.
El query no incluye
$elemMatch.El query cumple con todos los demás requisitos de query cubiertos.
Por ejemplo, la siguiente operación crea un índice compuesto multiclave en la colección movies en los campos genres y title:
db.movies.createIndex( { genres: 1, title: 1 } )
El índice anterior es multiclave porque el campo genres contiene valores de arreglo.
El índice abarca estos queries:
db.movies.find( { genres: 'Drama' }, { _id: 0, title: 1 } ).sort({ genres: 1 }).limit(5)
db.movies.find( { title: 'The Ace of Hearts', genres: 'Drama' }, { _id: 0, title: 1 } )
El índice no cubre el siguiente query porque la proyección contiene el campo de arreglo genres:
db.movies.find( { genres: 'Drama' }, { _id: 0, genres: 1 } ).limit(5)
Consulta en un campo de arreglo en su conjunto
Cuando una query especifica una coincidencia exacta de un arreglo en su conjunto, MongoDB utiliza el índice multiclave para localizar documentos que contengan el primer elemento de dicho arreglo. Sin embargo, solo con el índice no se puede comparar todo el arreglo. A continuación, MongoDB obtiene los documentos candidatos y los filtra para devolver únicamente aquellos cuyo arreglo coincida exactamente con el arreglo de la query.
Por ejemplo, la siguiente operación crea un índice multiclave en la colección movies sobre el campo genres:
db.movies.createIndex( { genres: 1 } )
La siguiente query busca documentos en que el campo genres es el arreglo [ "Drama" ]:
db.movies.find( { genres: 'Drama' }, { title: 1, genres: 1 } ).limit(5)
MongoDB puede utilizar el índice multiclave para encontrar documentos que tengan "Drama" en cualquier posición del arreglo genres. Luego, MongoDB recupera estos documentos y filtra los documentos cuyo arreglo genres sea igual al arreglo de la query [ "Drama" ].
$expr
El operador $expr no admite índices multiclave.
Obtén más información
Para aprender cómo MongoDB combina los límites del índice multiclave para mejorar el rendimiento, consulta Límites del índice multiclave.
Para aprender cómo hacer una query de los campos de arreglo, consulta: