Docs Menu
Docs Home
/
Manual de base de datos
/

Multikey Indexes

Para indexar un campo que contiene un valor de array, MongoDB crea una clave de índice para cada elemento único del array. Estos índices multiclave permiten consultas eficientes en campos de array. Se pueden construir índices multiclave sobre arrays que contienen tanto1 valores escalares [] (p. ej., cadenas, números) como documentos anidados. Si un array contiene varias instancias del mismo valor, el índice solo incluye una entrada para los valores.

Diagrama de un índice multiclave en el campo ``addr.zip`` . El campo ``addr`` contiene un arreglo de documentos de dirección. Los documentos de dirección contienen el campo ``zip``.
[1] Un valor escalar se refiere a un valor que no es un documento incrustado ni una matriz.

Puede utilizar índices de múltiples claves 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 multiclave, utilice el db.collection.createIndex() :

db.coll.createIndex( { <field>: < 1 or -1 > } )

MongoDB crea automáticamente un índice multiclave si algún campo indexado es una matriz; no es necesario especificar explícitamente el tipo multiclave.

Nota

Solo para los motores de almacenamiento WiredTiger y In-Memory,

En el caso de índices multiclave, MongoDB registra qué campo o campos indexados hacen que un índice sea multiclave. El seguimiento de esta información permite al motor de consultas de MongoDB utilizar límites de índice más estrictos.

Si un índice es multiclave, el cálculo de sus límites sigue reglas especiales. Para más información sobre los límites de índices multiclave, consulte Límites de índices multiclave.

En el caso de índices únicos, la restricción única se aplica a documentos separados de la colección en lugar de dentro de un solo documento.

Debido a que la restricción única se aplica a documentos separados, para un índice multiclave único, un documento puede tener elementos de matriz que resulten en valores de clave de índice repetidos siempre que los valores de clave de índice de ese documento no dupliquen los de otro documento.

Para obtener más información,consulte Restricción única en documentos separados.

En un índice compuesto multiclave, cada documento indexado puede tener como máximo un campo indexado cuyo valor sea una matriz. Es decir:

  • No se puede crear un índice multiclave compuesto si más de un campo indexable de un documento es una matriz. Por ejemplo, considere una colección que contiene el siguiente documento:

    { _id: 1, a: [ 1, 2 ], b: [ 1, 2 ], category: "AB - both arrays" }

    No se puede crear un índice multiclave compuesto { a: 1, b: 1 } en la colección ya que los campos a y b son matrices.

  • O bien, si ya existe un índice multiclave compuesto, no se puede insertar un documento que viole esta restricción.

    Consideremos una colección que contiene los siguientes documentos:

    { _id: 1, a: [1, 2], b: 1, category: "A array" }
    { _id: 2, a: 1, b: [1, 2], category: "B array" }

    Se permite un índice multiclave compuesto { a: 1, b: 1 } ya que para cada documento, solo un campo indexado por el índice multiclave compuesto es una matriz; es decir, ningún documento contiene valores de matriz para los campos a y b.

    Sin embargo, después de crear el índice compuesto de múltiples claves, si intenta insertar un documento donde los campos a y b son matrices, MongoDB fallará en la inserción.

Si un campo es una matriz de documentos, puede indexar los campos incrustados para crear un índice compuesto. Por ejemplo, considere una colección que contiene los siguientes documentos:

{ _id: 1, a: [ { x: 5, z: [ 1, 2 ] }, { z: [ 1, 2 ] } ] }
{ _id: 2, a: [ { x: 5 }, { z: 4 } ] }

Se puede crear un índice compuesto { "a.x": 1, "a.z": 1 } en. También se aplica la restricción de que un campo indexado como máximo puede ser una matriz.

Para ver un ejemplo, consulte Matrices de índice con documentos integrados.

Tip

Cuando ordenas según un campo de arreglo que está indexado con un índice multiclave, el plan del query incluye una etapa de ordenación en memoria, a menos que ambas de las siguientes condiciones sean verdaderas:

  • Los límites de índice para todos los campos de ordenación son [MinKey, MaxKey] y

  • Ningún límite para ningún campo indexado con múltiples claves tiene el mismo prefijo de ruta que el patrón de ordenación.

No se puede especificar un índice de clave múltiple como índice de clave de fragmento.

Sin embargo, si el índice de clave de fragmento es un prefijo de un índice compuesto, este puede convertirse en un índice compuesto multiclave si una de las otras claves (es decir, claves que no forman parte de la clave de fragmento) indexa una matriz. Los índices compuestos multiclave pueden afectar el rendimiento.

Los índices encriptada no pueden ser multikey.

Los índices multiclave pueden cubrir queries cuando se cumplen estas condiciones:

  • El query no devuelve el campo de arreglo (lo que significa que el arreglo no está incluido en la proyección del query). Esto significa que, para cubrir un query, el índice multiclave debe ser compuesto.

  • El query no incluye $elemMatch.

  • El query cumple con todos los demás requisitos de query cubiertos.

Por ejemplo, considere una colección matches con estos documentos:

db.matches.insertMany( [
{ name: "Joe", event: [ "open", "tournament" ] },
{ name: "Bill", event: [ "match", "championship" ] }
] )

La colección matches tiene un índice multiclave compuesto en los campos event y name:

db.matches.createIndex( { event: 1, name: 1 } )

El índice anterior es multiclave porque el campo event contiene valores de arreglo.

El índice abarca estos queries:

db.matches.find(
{ event: 'championship' },
{ _id: 0, name: 1 }
)
db.matches.find(
{ name: 'Bill', event: 'championship' },
{ _id: 0, name: 1 }
)

El índice no cubre el siguiente query porque la proyección contiene el campo de arreglo event:

db.matches.find(
{ event: 'championship' },
{ _id: 0, event: 1 }
)

Cuando un filtro de query especifica una coincidencia exacta para un arreglo en su conjunto, MongoDB puede usar el índice multikey para buscar el primer elemento del arreglo de la query, pero no puede utilizar la exploración del índice multikey para encontrar el arreglo completo. En cambio, después de usar el índice multikey para buscar el primer elemento del arreglo de la query, MongoDB recupera los documentos asociados y filtra aquellos cuyos arreglos coinciden con el arreglo en la query.

Por ejemplo, considere una colección inventory que contiene los siguientes documentos:

{ _id: 5, type: "food", item: "aaa", ratings: [ 5, 8, 9 ] }
{ _id: 6, type: "food", item: "bbb", ratings: [ 5, 9 ] }
{ _id: 7, type: "food", item: "ccc", ratings: [ 9, 5, 8 ] }
{ _id: 8, type: "food", item: "ddd", ratings: [ 9, 5 ] }
{ _id: 9, type: "food", item: "eee", ratings: [ 5, 9, 5 ] }

La colección tiene un índice multiclave en el campo ratings:

db.inventory.createIndex( { ratings: 1 } )

La siguiente query busca documentos en que el campo ratings es el arreglo [ 5, 9 ]:

db.inventory.find( { ratings: [ 5, 9 ] } )

MongoDB puede utilizar el índice multiclave para encontrar documentos que tengan 5 en cualquier posición del arreglo ratings. Luego, MongoDB recupera estos documentos y filtra los documentos cuyo arreglo ratings sea igual al arreglo de la query [ 5, 9 ].

$expr No admite índices multiclave.

Crea una colección survey con el siguiente documento:

db.survey.insertOne(
{ _id: 1, item: "ABC", ratings: [ 2, 5, 9 ] }
)

Crear un índice en el campo ratings:

db.survey.createIndex( { ratings: 1 } )

Dado que el campo ratings contiene una matriz, el índice de ratings es multiclave. Este índice multiclave contiene las siguientes tres claves de índice, cada una apuntando al mismo documento:

  • 2,

  • 5, y

  • 9.

Puede crear índices de múltiples claves en campos de matriz que contengan objetos anidados.

Consideremos una colección inventory con documentos de la siguiente forma:

{
_id: 1,
item: "abc",
stock: [
{ size: "S", color: "red", quantity: 25 },
{ size: "S", color: "blue", quantity: 10 },
{ size: "M", color: "blue", quantity: 50 }
]
}
{
_id: 2,
item: "def",
stock: [
{ size: "S", color: "blue", quantity: 20 },
{ size: "M", color: "blue", quantity: 5 },
{ size: "M", color: "black", quantity: 10 },
{ size: "L", color: "red", quantity: 2 }
]
}
{
_id: 3,
item: "ijk",
stock: [
{ size: "M", color: "blue", quantity: 15 },
{ size: "L", color: "blue", quantity: 100 },
{ size: "L", color: "red", quantity: 25 }
]
}
...

La siguiente operación crea un índice de clave múltiple en los campos stock.size y stock.quantity:

db.inventory.createIndex( { "stock.size": 1, "stock.quantity": 1 } )

El índice compuesto de múltiples claves puede admitir consultas con predicados que incluyan tanto campos indexados como predicados que incluyan solo el prefijo de índice "stock.size", como en los siguientes ejemplos:

db.inventory.find( { "stock.size": "M" } )
db.inventory.find( { "stock.size": "S", "stock.quantity": { $gt: 20 } } )

Para obtener más información sobre cómo MongoDB puede combinar límites de índices multiclave, consulte Límites de índices multiclave. Para obtener más información sobre el comportamiento de los índices y prefijos compuestos,consulte Índices y prefijos compuestos.

El índice compuesto de múltiples claves también puede admitir operaciones de ordenamiento, como los siguientes ejemplos:

db.inventory.find( ).sort( { "stock.size": 1, "stock.quantity": 1 } )
db.inventory.find( { "stock.size": "M" } ).sort( { "stock.quantity": 1 } )

Para obtener más información sobre el comportamiento de los índices compuestos y las operaciones de ordenación,consulte Usar índices para ordenar los resultados de las consultas.

Volver

Compuesto

En esta página