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
/

Multikey Indexes

Para indexar un campo que contiene un valor de arreglo, MongoDB crea una clave de índice para cada elemento único en el arreglo. Estos índices multikey soportan queries eficientes en campos de tipo arreglos. Los índices multikey pueden construirse sobre arreglos que contienen tanto valores escalares [1] (por ejemplo, cadenas, números) y documentos anidados. Si un arreglo contiene varias instancias del mismo valor, el índice sólo 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 ni un documento incrustado ni un arreglo.

Puedes usar índices multi-clave 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 multiclave, utilice el db.collection.createIndex() :

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

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

Nota

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

Para los índices multiclave, MongoDB rastrea qué campo o campos indexados hacen que un índice sea un índice multiclave. El seguimiento de esta información permite que el motor de query de MongoDB use límites del índice más estrictos.

Si un índice es multiclave, el cálculo de los límites del índice sigue reglas especiales. Para obtener detalles sobre los límites del índice multikey, consulte Límites del índice multikey.

Para los índices únicos, la restricción única se aplica en todos los documentos independientes de la colección, en lugar de dentro de un solo documento.

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

Para más información, vea 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 compuesto multikey si más de un campo por indexar de un documento es un arreglo. Por ejemplo, considere una colección que contenga 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.

    Considera 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" }

    Un índice multiclave compuesto { a: 1, b: 1 } es permisible ya que, para cada documento, solo un campo indexado por el índice multiclave compuesto es un arreglo; es decir, ningún documento contiene valores de matriz tanto para los campos a como para b.

    Sin embargo, después de crear el índice multiclave compuesto, si se intenta insertar un documento donde ambos campos, a y b, son arreglos, MongoDB fallará la inserción.

Si un campo es un arreglo de documentos, puedes indexar los campos incorporados para crear un índice compuesto. Por ejemplo, considere una colección que contenga los siguientes documentos:

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

Puede crear un índice compuesto en { "a.x": 1, "a.z": 1 }. La restricción de que como máximo un campo indexado puede ser un arreglo también se aplica.

Para un ejemplo, consulta Índice de arreglos con documentos incrustados

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 del í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 partición es un prefijo de un índice compuesto, se permite que el índice compuesto se convierta en un índice multiclave compuesto si una de las otras claves (es decir, claves que no forman parte de la clave de partición) indexa un arreglo. Los índices compuestos de múltiple clave pueden tener un impacto en 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.

Cree 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 un arreglo, el índice en ratings es multiclave. El í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.

Considera una inventory colección con documentos del siguiente formulario:

{
_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 multiclave 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 del í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 detalles sobre cómo MongoDB puede combinar límites del índice multiclave, consulta Límites del índice multiclave. Para obtener más información sobre el comportamiento de los índices compuestos y los prefijos, consulte índices compuestos y prefijos.

El índice compuesto de múltiples claves también puede admitir operaciones de ordenación, 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 ordenamiento, consulte Utilizar índices para ordenar los resultados de las consultas.

Volver

Compuesto

En esta página