Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Multikey Indexes

Los índices multiclave recopilan y ordenan datos de campos que contienen valores de matriz. Estos índices mejoran el rendimiento de las consultas en campos de matriz.

No necesita especificar explícitamente un índice como multiclave. Si crea un índice en un campo que contiene un valor de arreglo, MongoDB crea automáticamente el índice como un índice multiclave.

Para cada valor distinto en el arreglo, MongoDB crea una entrada separada en el índice, y cada entrada apunta al mismo documento. Como resultado, un solo documento puede tener múltiples entradas en un índice de varias claves. Si un arreglo contiene múltiples instancias del mismo valor, el índice solo incluye una entrada para ese valor.

MongoDB puede crear índices multiclave sobre arreglos que contienen tanto valores escalares (por ejemplo, strings y números) como documentos incrustados.

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 campo addr.zip:

Índice multiclave en el campo ``addr.zip`` dentro de una matriz de documentos de direcciones.

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.

Para crear un índice multiclave, consulta:

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 sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en su implementación autogestionada de MongoDB, 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.

A partir de MongoDB 9.0, si un campo indexado se convierte en un campo de clave múltiple mientras se ejecuta una consulta que hace referencia a dicho campo, la consulta podría fallar con un QueryKilledError. Un campo indexado se convierte en clave múltiple cuando se inserta o actualiza un documento, de modo que el campo contiene un valor de matriz.

Si su consulta falla con este error, vuelva a ejecutarla una vez que se complete la operación de inserción o actualización.

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 aprender más y ver un ejemplo de este comportamiento, consulta 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 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.

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

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

El operador $expr no admite índices multiclave.