Docs Menu
Docs Home
/ /

Multikey Indexes

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 de múltiples claves en el addr.zip campo:

Diagrama de un índice multiclave en el campo ``addr.zip`` . El campo ``addr`` contiene un arreglo de documentos de dirección. Los documentos de dirección contienen el campo ``zip``.

Puede Cree y administre índices de múltiples claves en la interfaz de usuario para implementaciones alojadas en MongoDB Atlas.

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 de una colección movies contienen un campo genres: una matriz de géneros asociados a cada película. Normalmente, se buscan películas con géneros específicos, como buscar todas las películas que pertenecen a Drama y 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.

Para crear un índice multiclave, consulta:

  • Crea un índice en un campo de arreglo

  • Crea un índice en un campo insertado en un arreglo

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.

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.

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 obtener más información y ver un ejemplo de este comportamiento, consulte Restricción única en documentos separados.

En un índice multiclave compuesto, cada documento indexado puede tener, como máximo, un campo indexado cuyo valor sea un arreglo. Específicamente:

  • No se puede crear un índice multiclave compuesto si más de un campo en la especificación del índice es una matriz.

  • Si ya existe un índice multiclave compuesto, no puedes insertar un documento que violaría esta restricción.

Por ejemplo, puede crear un índice multiclave compuesto { genres: 1, year: 1 } en la colección movies porque, para cada documento, solo un campo indexado por el índice multiclave compuesto es una matriz. Ningún documento contiene valores de matriz para los 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.

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.

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.

Los índices encriptados no pueden ser multiclave.

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 multiclave compuesto 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)

Cuando una consulta especifica una coincidencia exacta para una matriz completa, MongoDB utiliza el índice multiclave para localizar los documentos que contienen el primer elemento de dicha matriz. Sin embargo, no puede encontrar la coincidencia completa utilizando únicamente el índice. MongoDB recupera los documentos candidatos y los filtra para devolver solo aquellos cuya matriz coincida exactamente con la matriz de la consulta.

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" ].

El operador $expr no admite índices multiclave.

Volver

Orden de clasificación

En esta página