Skip to content

Latest commit

 

History

History
135 lines (84 loc) · 8.72 KB

indices-compuestos.md

File metadata and controls

135 lines (84 loc) · 8.72 KB

Í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:

[ 1 ] MongoDB impone un limit of 32 fields for any compound index.

Los índices compuestos pueden admitir consultas que coincidan en varios campos.

Crear un índice compuesto

Para crear un índice compuesto, utilice una operación que se parezca al siguiente prototipo:

db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )

El valor del campo en la especificación del índice describe el tipo de índice para ese campo. Por ejemplo, un valor de 1especifica un índice que ordena los elementos en orden ascendente. Un valor de -1especifica un índice que ordena los elementos en orden descendente. Para tipos de índices adicionales, consulte tipos de índices .

IMPORTANTE:

A partir de MongoDB 4.4:

En MongoDB 4.2 o anterior:

Considere una colección nombrada productsque 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 itemy stock:

db.products.createIndex( { "item": 1, "stock": 1 } )

El orden de los campos enumerados en un índice compuesto es importante. El índice contendrá referencias a documentos ordenados primero por los valores del itemcampo y, dentro de cada valor del itemcampo, ordenados por valores del campo de valores. Consulte Orden de clasificación para obtener más información.

Además de admitir consultas que coinciden en todos los campos de índice, los índices compuestos pueden admitir consultas que coinciden en el prefijo de los campos de índice. Es decir, los soportes del índice de consultas sobre el itemterreno, así como tanto itemy stockcampos:

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

Para obtener más información, consulte Prefijos .

Orden de clasificación

Los índices almacenan referencias a 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 atravesar el índice en cualquier dirección. Sin embargo, para los índices compuestos , el orden de clasificación puede ser importante para determinar si el índice puede admitir una operación de clasificación.

Considere una colección eventsque contiene documentos con los campos usernamey date. Las aplicaciones pueden emitir consultas que devuelven resultados ordenados primero por usernamevalores ascendentes y luego por valores descendentes (es decir, del más reciente al último) date, como por ejemplo:

db.events.find().sort( { username: 1, date: -1 } )

o consultas que devuelven resultados ordenados primero por username valores descendentes y luego por datevalores ascendentes , como:

db.events.find().sort( { username: -1, date: 1 } )

El siguiente índice puede admitir estas dos operaciones de ordenación:

db.events.createIndex( { "username" : 1, "date" : -1 } )

Sin embargo, el índice anterior no puede admitir la ordenación por usernamevalores ascendentes y luego por datevalores 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 la consulta .

Prefijos

Los prefijos de índice son los subconjuntos iniciales de 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 sobre los prefijos del índice. Como tal, MongoDB puede usar el índice para consultas en los siguientes campos:

  • el itemcampo,
  • el itemcampo y el locationcampo,
  • el itemcampo y el locationcampo y el stockcampo.

MongoDB también puede usar el índice para admitir una consulta en los campos itemy stock, ya que el itemcampo corresponde a un prefijo. Sin embargo, en este caso, el índice no sería tan eficiente para respaldar la consulta como lo sería si el índice estuviera solo en itemy stock. Los campos de índice se analizan en orden; si una consulta omite un prefijo de índice en particular, no puede hacer uso de ningún campo de índice que siga a ese prefijo.

Dado que una consulta sobre itemy stockomite el locationprefijo de índice, no puede utilizar el stockcampo de índice que sigue location. Solo el itemcampo del índice puede admitir esta consulta. Consulte Crear índices para respaldar sus consultas para obtener más información.

MongoDB no puede usar el índice para admitir consultas que incluyan los siguientes campos, ya que sin el itemcampo, ninguno de los campos enumerados corresponde a un índice de prefijo:

  • el locationcampo,
  • el stockcampo, o
  • los campos locationy stock.

Si tiene 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 escasa o única, entonces puede eliminar el índice del prefijo (por ejemplo { a: 1 }). MongoDB usará el índice compuesto en todas las situaciones en las que habría usado el índice de prefijo.

Intersección de índice

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

Consideraciones adicionales

Las aplicaciones pueden encontrar un rendimiento reducido durante la creación de índices, incluido el acceso limitado de lectura / escritura a la colección. Para obtener más información sobre el proceso de generación de índices, consulte Generaciones de índices en colecciones pobladas , incluida la sección Generaciones de índices en entornos replicados .

Algunos controladores pueden especificar índices, utilizando en NumberLong(1)lugar de 1como especificación. Esto no tiene ningún efecto sobre el índice resultante.