Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/
Manual de base de datos
/

Índices compuestos

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:

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 coinciden en varios campos.

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.

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:

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.

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.

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

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

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:

  1. Coincide con claves para item.

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

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

  • los campos location y stock.

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.

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.

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