Docs Menu
Docs Home
/
Manual de base de datos
/

Índices compuestos

MongoDB admite í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:

Diagrama de un índice compuesto en el campo ``userid`` (ascendente) y en el campo ``score`` (descendente). El índice clasifica primero por el campo ``userid`` y luego por el campo ``score``.
[1] MongoDB impone una límite de 32 campos para cualquier índice compuesto.

Los índices compuestos pueden admitir consultas que coincidan en múltiples campos.

Puede utilizar índices compuestos para implementaciones alojadas en MongoDB Atlas.

Para obtener más información sobre cómo administrar índices para implementaciones alojadas en MongoDB Atlas, consulte Crear, ver, eliminar y ocultar índices.

Para crear un índice compuesto utilice una operación que se parezca 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

Comenzando en MongoDB 4.4:

  • Los índices compuestos pueden contener un solo campo de índice encriptado.

  • Recibirá un error si intenta crear un índice compuesto que contenga más de un campo de índice hash.

En MongoDB 4.2 o anterior:

Consideremos una colección llamada products que contiene documentos que se parecen al siguiente documento:

{
"_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 en un índice compuesto es importante. El índice contendrá referencias a documentos ordenados primero por los valores del item campo y, dentro de cada valor del item campo, por los valores del campo de stock. Consulte Orden de clasificación para obtener más información.

Además de admitir consultas que coinciden con todos los campos del índice, los índices compuestos admiten consultas que coinciden con el prefijo de los campos del índice. Es decir, el índice admite consultas en el campo item, así como en los campos item y stock:

db.products.find( { item: "Banana" } )
db.products.find( { item: "Banana", stock: { $gt: 5 } } )

Para obtener más detalles, consulte Prefijos.

Los índices almacenan referencias a campos en orden ascendente1 () o descendente-1 (). En el caso de índices de un solo campo, el orden de las claves no importa, ya que MongoDB puede recorrer el índice en ambas direcciones. Sin embargo, en el caso de índices compuestos, el orden de las claves puede ser importante para determinar si el índice admite una operación de ordenación.

Considere una colección events que contiene documentos con los campos username y date. Las aplicaciones pueden ejecutar consultas que devuelvan resultados ordenados primero por valores username de forma ascendente y luego por valores date de forma descendente (es decir, del más reciente al último), 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 admitir 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.

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 de índice:

  • { 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 item campo y el location campo,

  • el item campo y el location campo y el stock campo.

MongoDB también puede usar el índice para admitir una consulta 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 consulta como lo sería si solo estuviera en item y stock.

Dado que una consulta en item y stock omite el prefijo de índice location, no puede usar el campo de índice stock que sigue a location. Solo el campo item del índice admite esta consulta. Consulte "Crear índices para sus consultas" para obtener más información. El índice:

  1. Coincide con claves para item.

  2. Realiza un filtro dentro de la etapa IXSCAN en el campo stock.

  3. Devuelve 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, o

  • los campos location y stock.

Si tiene una colección con un índice compuesto y un índice en su prefijo (p. ej., { a: 1, b: 1 } y { a: 1 }), si ninguno de los índices tiene una restricción dispersa o única, puede eliminar el índice en el prefijo (p. ej., { a: 1 }). MongoDB usará el índice compuesto en todas las situaciones en las que habría usado el índice de prefijo.

A partir de la 2.6 versión, MongoDB puede usar la intersección de índices para procesar consultas. La elección entre crear índices compuestos que admitan sus consultas o confiar en la intersección de índices depende de las características específicas de su sistema. Consulte Intersección de índices e Índices compuestos para obtener más información.

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.

Ascending indexes
Descending indexes

Solo indexa un documento cuando este contiene un valor para uno de los campos geospatial. No indexa documentos en los índices ascendentes o descendentes.

Ascending indexes
Descending indexes

Solo indexa un documento cuando coincide con uno de los campos text. No indexa documentos en los índices ascendentes o descendentes.

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 usan Long(1) en lugar de 1 para especificar el orden del índice. Los índices resultantes son los mismos.

Volver

Campo único

En esta página