Un índice se vuelve cuando indexa un campo que contiene un array. MongoDB crea entradas de índice para los elementos, permitiendo consultar valores dentro del array sin recorrer toda la colección.
multikey
JavaScript
db.products.createIndex({businessId:1,tags:1});
Documento:
JavaScript
{
businessId,tags:['coffee','organic','ground']}
El documento contribuye con varias claves asociadas a sus tags.
Un documento con tres tags genera pocas entradas. Uno con cien mil elementos puede generar una enorme cantidad de claves y hacer costosas las escrituras.
Texto
1 documento
× N elementos indexados
→ múltiples index keys
Por eso un array ilimitado es un problema de documento e índice.
Las condiciones separadas pueden corresponder a elementos distintos. $elemMatch expresa que deben pertenecer al mismo elemento y puede permitir bounds más precisos:
Un compound index puede incluir un campo array junto a campos escalares:
JavaScript
{businessId:1,'items.productId':1,createdAt:-1}
MongoDB restringe compounds donde más de un campo indexado es array en el mismo documento, porque la combinación cartesiana de elementos sería ambigua o explosiva.
Debes verificar el schema completo, no solo documentos de muestra. Una futura migración que convierta otro campo en array puede hacer inválidas escrituras o builds.
Una query sobre arrays puede necesitar sort adicional incluso si el campo está en el índice. La interacción depende de bounds, paths y si el sort comparte prefijos con campos multikey.
No asumas que { tags: 1, createdAt: -1 } ordena todas las consultas por tags sin revisar explain().
Covered queries con multikey tienen restricciones. Si la projection devuelve el propio array, el servidor normalmente necesita leer el documento. Una query sobre otro campo podría cubrirse bajo condiciones específicas.
Confirma ausencia de FETCH y totalDocsExamined: 0; no deduzcas cobertura por la definición del índice.
Si un array contiene el mismo valor varias veces, MongoDB evita algunas duplicaciones internas por documento, pero el diseño no debe depender de detalles de implementación. Los duplicados siguen afectando semántica y tamaño del documento.
$addToSet evita igualdad exacta en el array, no sustituye una colección con índice unique para una relación.
Un unique multikey index protege la combinación de claves entre documentos, pero permite repeticiones derivadas dentro del mismo documento bajo reglas específicas. No sirve para imponer “cada subdocumento del array tiene userId único dentro de este documento” de forma general.
Wildcard indexes pueden indexar múltiples paths, incluyendo arrays según reglas específicas. Son útiles para schemas dinámicos, pero pueden generar gran cantidad de claves y no sustituyen índices deliberados para hot paths.
Un multikey index permite consultar arrays, pero cada elemento puede convertirse en trabajo de índice. $elemMatch, cardinalidad, compound restrictions, sort y coverage deben comprenderse antes de usarlo. Los arrays ilimitados no se vuelven sostenibles por estar indexados.
Comprueba lo aprendido
¿Qué vuelve multikey a un índice?
¿Por qué $elemMatch ayuda a los bounds?
¿Qué restricción existe con dos arrays en un compound?
¿Por qué unique multikey no garantiza unicidad interna?
¿Qué métrica revela explosión de claves?
¿Cuándo separarías los elementos en otra colección?