MongoDB soporta índices compuestos, donde una única estructura de índice contiene referencias a múltiples campos [1] dentro de los documentos de una colección. El siguiente diagrama ilustra un ejemplo de un índice compuesto en dos campos:
| [1] | MongoDB impone una límite de 32 campos para cualquier índice compuesto. |
Los índices compuestos pueden admitir consultas que coinciden en varios campos.
Compatibilidad
Puedes usar índices compuestos para implementaciones alojadas en MongoDB Atlas.
Para obtener más información sobre cómo administrar índices para las implementaciones alojadas en MongoDB Atlas, consulta Crear, ver, eliminar y ocultar índices.
Crear un índice compuesto
Para crear un índice compuesto, utiliza una operación que se asemeje al siguiente prototipo:
db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )
El orden de los campos indexados tiene un fuerte impacto en la efectividad de un índice particular para una query determinada. Para la mayoría de los índices compuestos, seguir la regla ESR (igualdad, ordenación, rango) ayuda a crear índices eficientes.
Importante
A partir de MongoDB 4.4:
Los índices compuestos pueden contener un solo campo de índice encriptado.
Recibirás un error si intentas crear un índice compuesto que contenga más de un campo de índice encriptado.
En MongoDB 4.2 o anterior:
Los índices compuestos no pueden contener un campode índice encriptado..
Recibirás un error si intentas crear un índice compuesto que contenga un campo de índice hashado.
Consideremos una colección llamada products que contiene documentos que se asemejan al siguiente:
{ "_id": ObjectId(...), "item": "Banana", "category": ["food", "produce", "grocery"], "location": "4th Street Store", "stock": 4, "type": "cases" }
La siguiente operación crea un índice ascendente en los campos item y stock:
db.products.createIndex( { "item": 1, "stock": 1 } )
El orden de los campos listados en un índice compuesto es importante. El índice contendrá referencias a los documentos ordenados primero por los valores del campo item y, dentro de cada valor del campo item, ordenados por los valores del campo de acciones. Consulta Orden de clasificación para más información.
Además de soportar queries que coincidan con todos los campos del índice, los índices compuestos pueden soportar queries que coincidan con el prefijo de los campos del índice. Es decir, el índice admite queries sobre el campo item, así como sobre ambos campos item y stock:
db.products.find( { item: "Banana" } ) db.products.find( { item: "Banana", stock: { $gt: 5 } } )
Para obtener más detalles, consulta Prefijos.
Orden de clasificación
Los índices almacenan referencias a los campos en orden ascendente (1) o descendente (-1). Para los índices de un solo campo, el orden de clasificación de las claves no importa porque MongoDB puede recorrer el índice en cualquier dirección. Sin embargo, para índices compuestos, el orden de clasificación puede ser importante para determinar si el índice puede apoyar una operación de clasificación.
Considera una colección, events, que contiene documentos con los campos username y date. Las aplicaciones pueden emitir consultas que devuelvan resultados ordenados primero por valores ascendentes de username y luego por valores descendentes (es decir, de más recientes a últimos) de date, como:
db.events.find().sort( { username: 1, date: -1 } )
o consultas que devuelvan resultados ordenados primero por valores de username en orden descendente y luego por valores de date en orden ascendente, tales como:
db.events.find().sort( { username: -1, date: 1 } )
El siguiente índice puede realizar ambas operaciones de clasificación:
db.events.createIndex( { "username" : 1, "date" : -1 } )
Sin embargo, el índice anterior no puede admitir la clasificación por username valores ascendentes y luego por date valores ascendentes, como los siguientes:
db.events.find().sort( { username: 1, date: 1 } )
Para obtener más información sobre el orden de clasificación y los índices compuestos, consulte Usar índices para ordenar los resultados de una consulta.
Prefijos
Los prefijos de índice son los subconjuntos iniciales de los campos indexados. Por ejemplo, considere el siguiente índice compuesto:
{ "item": 1, "location": 1, "stock": 1 }
El índice tiene los siguientes prefijos:
{ item: 1 }{ item: 1, location: 1 }
Para un índice compuesto, MongoDB puede usar el índice para admitir consultas en los prefijos del índice. Por lo tanto, MongoDB puede usar el índice para queries en los siguientes campos:
El campo
item,el campo
itemy el campolocation,el
itemcampo y ellocationcampo y elstockcampo.
MongoDB también puede usar el índice para admitir una query en los campos item y stock, ya que el campo item corresponde a un prefijo. Sin embargo, en este caso, el índice no sería tan eficiente para admitir la query como lo sería si el índice estuviera solo en item y stock.
Dado que una query sobre item y stock omite el prefijo del índice location, no puede utilizar el campo del índice stock que sigue a location. Solo el campo item del índice puede admitir esta query. Consulta Crear índices para dar soporte a tus consultas para obtener más información. El índice:
Coincide con claves para
item.Realiza un filtro dentro de la etapa
IXSCANen el campostock.Retorna el resultado filtrado.
Por ejemplo, considera un query para "item":
"saccharomyces cerevisiae" y "stock": 60. Si la colección contiene 10000 documentos que coinciden con "item":
"saccharomyces cerevisiae" y solo 100 de esos documentos coinciden con "stock": 60, el query examina 10000 claves. En la plataforma IXSCAN, el query filtra esas claves por el campo stock y solo devuelve 100 resultados a la plataforma siguiente.
MongoDB no puede usar el índice para admitir consultas que incluyan los siguientes campos ya que sin el campo item, ninguno de los campos enumerados corresponde a un índice de prefijo:
El campo
location,el campo
stock, olos campos
locationystock.
Si tienes una colección que tiene tanto un índice compuesto como un índice en su prefijo (por ejemplo, { a: 1, b: 1 } y { a: 1 }), si ninguno de los índices tiene una restricción de unicidad o de dispersión, se puede remover el índice en el prefijo (por ejemplo, " { a: 1 }). MongoDB utilizará el índice compuesto en todas las situaciones en las que habría utilizado el índice prefijo.
Intersección de Índices
A partir de la versión 2.6, MongoDB puede usar la intersección de índices para mostrar las queries. La elección entre crear índices compuestos que admitan tus queries o depender de la intersección de índices depende de los detalles de tu sistema. Consulta Intersección de índices e índices compuestos para obtener más detalles.
Índices compuestos dispersos
Los índices compuestos pueden contener diferentes tipos de índices dispersos. La combinación de tipos de índice determina cómo el índice compuesto coincide con los documentos.
Esta tabla resume el comportamiento de un índice compuesto que incluye diferentes tipos de índices escasos:
Componentes del índice compuesto | Comportamiento del índice compuesto |
|---|---|
Ascending indexes Descending indexes | Solo indexa documentos que contengan un valor para, al menos, una de las claves. |
Solo indexa un documento cuando este contiene un valor para uno de los campos | |
Solo indexa un documento cuando coincide con uno de los campos |
Consideraciones adicionales
Durante la creación de índices, las aplicaciones pueden experimentar un rendimiento reducido o acceso de lectura/escritura limitado a la colección que se está indexando.
Para obtener más información sobre el proceso de creación de índices, consulte Creaciones de índices en colecciones pobladas, especialmente la sección Creaciones de índices en entornos replicados.
Algunos controladores utilizan Long(1) en lugar de 1 para especificar el orden del índice. Los índices resultantes son los mismos.