Los límites del índice definen el rango de valores índices que MongoDB busca cuando utiliza un índice para satisfacer una query. Cuando se especifican múltiples predicados de query en un campo indexado, MongoDB intenta combinar los límites de esos predicados para producir un escaneo de índice con límites más pequeños. Los límites del índice más pequeños resultan en queries más rápidas y en un menor uso de recursos.
MongoDB combina los límites ya sea intersección o combinación de límites.
Intersección de límites para un índice multiclave
La intersección de límites se refiere al punto donde se superponen múltiples límites. Por ejemplo, dados los límites [ [ 3, Infinity ] ] y [ [
-Infinity, 6 ] ], la intersección de los límites da como resultado [ [ 3, 6
] ].
Dado un campo de arreglo indexado, considere una query que especifique varios predicados de query en el arreglo y utilice una Índice multiclave para cumplir la query. MongoDB puede intersectar los límites del índice multikey si un operador $elemMatch une los predicados de la consulta.
Ejemplo: Intersección de límites
El siguiente ejemplo muestra cómo MongoDB utiliza la intersección de límites para definir un rango más reducido de valores a query, lo que se traduce en una mejora del rendimiento de las querys.
Crear un índice multi-clave
Cree un índice multiclave en el arreglo grades:
db.students.createIndex( { grades: 1 } )
Query la colección
Ejecute la siguiente query:
db.students.find( { grades : { $elemMatch: { $gte: 90, $lte: 99 } } } )
La query anterior utiliza $elemMatch para devolver documentos donde el arreglo grades contiene al menos un elemento que cumple ambas condiciones especificadas.
Tomando los predicados de la query por separado:
Los límites para el predicado mayor o igual que 90 (
$gte: 90) son[ [ 90, Infinity ] ].Los límites para el predicado menor o igual a 99 (
$lte: 99) son[ [ -Infinity, 99 ] ].
Debido a que la query usa $elemMatch para unir estos predicados, MongoDB interseca los límites a:
ratings: [ [ 90, 99 ] ]
query sin $elemMatch
Si la query no une las condiciones en el campo arreglo con $elemMatch, MongoDB no puede cruzar los límites del índice multiparámetro.
Considere esta query:
db.students.find( { grades: { $gte: 90, $lte: 99 } } )
La consulta busca en el arreglo grades:
Al menos un elemento mayor o igual que
90Al menos un elemento menor o igual que
99
El mismo elemento puede satisfacer ambos criterios.
Debido a que la query previa no utiliza $elemMatch, MongoDB no cruza los límites. En su lugar, MongoDB utiliza cualquiera de los siguientes límites:
[ [ 90, Infinity ] ][ [ -Infinity, 99 ] ]
MongoDB no ofrece garantía sobre cuáles de los dos límites elige.
Límites compuestos para un índice de múltiples claves
Los límites compuestos combinan los límites para múltiples claves de un índice compuesto. Utilizar límites de múltiples claves reduce el tiempo que toma procesar una consulta porque MongoDB no necesita calcular resultados para cada límite individualmente.
Por ejemplo, considere un índice compuesto { temperature: 1, humidity: 1
} con los siguientes límites:
temperaturetiene un límite de[ [ 80, Infinity ] ].humiditytiene un límite de[ [ -Infinity, 20 ] ].
La combinación de los límites da lugar al uso de ambos límites:
{ temperature: [ [ 80, Infinity ] ], humidity: [ [ -Infinity, 20 ] ] }
Si MongoDB no puede agrupar los dos límites, MongoDB restringe el escaneo del índice mediante el límite en el campo principal. En este ejemplo, el campo principal es temperature, lo que resulta en una restricción de temperature: [
[ 80, Infinity ] ].
Ejemplo: Límites compuestos de un campo no de arreglo y un campo de arreglo
El siguiente ejemplo muestra cómo MongoDB utiliza restricciones compuestas para definir una restricción de query más eficiente, lo que resulta en un mejor rendimiento de la query.
Crea un índice compuesto de múltiples claves
Crea un índice compuesto de múltiples claves en los campos item y ratings:
db.survey.createIndex( { item: 1, ratings: 1 } )
Query la colección
Ejecute la siguiente query:
db.survey.find( { item: "XYZ", ratings: { $gte: 3 } } )
La anterior query especifica una condición sobre ambas claves del índice (item y ratings).
Tomando cada uno de los predicados por separado:
Los límites para el predicado
item: "XYZ"son[ [ "XYZ", "XYZ" ]].Los límites para el predicado
ratings: { $gte: 3 }son[ [ 3, Infinity ] ].
MongoDB utiliza los límites combinados de:
{ item: [ [ "XYZ", "XYZ" ] ], ratings: [ [ 3, Infinity ] ] }
Ejemplo: Límites compuestos de campos que no son arreglos y múltiples campos de arreglos
El siguiente ejemplo muestra cómo MongoDB utiliza límites compuestos cuando un índice incluye un campo que no es de arreglo y varios campos de arreglo.
Rellenar una colección de muestra
Crea una colección survey2 que contenga documentos con un campo de string item y un campo de arreglo ratings:
db.survey2.insertMany( [ { _id: 1, item: "ABC", ratings: [ { score: 2, by: "mn" }, { score: 9, by: "anon" } ] }, { _id: 2, item: "XYZ", ratings: [ { score: 5, by: "anon" }, { score: 7, by: "wv" } ] } ] )
Query la colección
Ejecute la siguiente query:
db.survey2.find( { item: "XYZ", "ratings.score": { $lte: 5 }, "ratings.by": "anon" } )
Tomando cada uno de los predicados por separado:
Los límites para el predicado
item: "XYZ"son[ [ "XYZ", "XYZ" ] ].Los límites para el predicado
score: { $lte: 5 }son[ [ -Infinity, 5] ].Los límites para el predicado
by: "anon"son[ "anon", "anon" ].
MongoDB compone los límites para la clave item con los límites para "ratings.score" o los límites para "ratings.by", según los predicados de la query y los valores de clave del índice. MongoDB no garantiza con qué límites se compone con el campo item.
MongoDB cumple la query de una de las siguientes maneras:
MongoDB compone los límites de
itemcon los límites de"ratings.score":{ "item" : [ [ "XYZ", "XYZ" ] ], "ratings.score" : [ [ -Infinity, 5 ] ], "ratings.by" : [ [ MinKey, MaxKey ] ] } MongoDB compone los límites de
itemcon los límites de"ratings.by":{ "item" : [ [ "XYZ", "XYZ" ] ], "ratings.score" : [ [ MinKey, MaxKey ] ], "ratings.by" : [ [ "anon", "anon" ] ] }
Para agrupar los límites de "ratings.score" con los límites de "ratings.by", la consulta debe utilizar $elemMatch.
Límites compuestos de campos múltiples del mismo arreglo
Para componer los límites para las claves de índice del mismo arreglo, ambas condiciones deben cumplirse:
Las claves de índice deben compartir la misma ruta de campo hasta, pero excluyendo, los nombres de los campos.
La query debe especificar predicados en los campos usando
$elemMatchen esa ruta.
Para un campo en un documento incrustado, el nombre de campo con puntos, como "a.b.c.d", es la ruta de campo para d. Para componer los límites para las claves de índice del mismo arreglo, el $elemMatch debe estar en la ruta hasta pero excluyendo el propio nombre del campo (lo que significa "a.b.c").
Ejemplo
El siguiente ejemplo muestra cómo MongoDB combina los límites para las claves de índice del mismo arreglo. Este ejemplo utiliza la colección survey2 utilizada en el ejemplo anterior.
Query la colección
Ejecute la siguiente query:
db.survey2.find( { ratings: { $elemMatch: { score: { $lte: 5 }, by: "anon" } } } )
La query precedente usa $elemMatch en el campo ratings para requerir que el arreglo contenga al menos un elemento único que cumpla ambas condiciones.
Tomando cada uno de los predicados por separado:
Los límites para el predicado
score: { $lte: 5 }son[ [ -Infinity, 5 ] ].Los límites para el predicado
by: "anon"son[ [ "anon", "anon" ] ].
MongoDB compone los dos límites en los siguientes límites:
{ "ratings.score" : [ [ -Infinity, 5 ] ], "ratings.by" : [ [ "anon", "anon" ] ] }
Ejemplo: $elemMatch en Rutas de Campo Divergentes
Si tu $elemMatch especifica en campos que divergen de una ruta común, MongoDB no puede componer los límites de claves de índice de un mismo arreglo.
El siguiente ejemplo demuestra $elemMatch en rutas de campos divergentes.
Rellenar una colección de muestra
Cree una colección survey3 que contenga documentos con un campo de string item y un campo de arreglo ratings:
db.survey3.insertMany( [ { _id: 1, item: "ABC", ratings: [ { scores: [ { q1: 2, q2: 4 }, { q1: 3, q2: 8 } ], loc: "A" }, { scores: [ { q1: 2, q2: 5 } ], loc: "B" } ] }, { _id: 2, item: "XYZ", ratings: [ { scores: [ { q1: 7 }, { q1: 2, q2: 8 } ], loc: "B" } ] } ] )
Crea un índice compuesto de múltiples claves
Crea un índice compuesto en los campos ratings.scores.q1 y ratings.scores.q2:
db.survey3.createIndex( { "ratings.scores.q1": 1, "ratings.scores.q2": 1 } )
Los campos "ratings.scores.q1" y "ratings.scores.q2" comparten la ruta de campo "ratings.scores". Para combinar los límites de índice, una consulta debe usar $elemMatch en la ruta de campo común.
Query la colección
La siguiente query utiliza un $elemMatch no en la ruta requerida:
db.survey3.find( { ratings: { $elemMatch: { 'scores.q1': 2, 'scores.q2': 8 } } } )
MongoDB no puede componer los límites del índice y el campo "ratings.scores.q2" no está restringido durante el escaneo del índice.
Para compaginar los límites, la consulta debe utilizar $elemMatch en la ruta común "ratings.scores":
db.survey3.find( { 'ratings.scores': { $elemMatch: { 'q1': 2, 'q2': 8 } } } )