MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Índices multichave do MongoDB e limites de interseção de índice



O MongoDB tem um ótimo suporte para arrays e oferece muita flexibilidade no seu modo de documento. Por exemplo, você pode embutir arrays em documentos e também embutir documentos em arrays, etc. No entanto, trabalhar com arrays tem várias pegadinhas no MongoDB. Neste post, veremos alguns dos problemas que o MongoDB tem com índices e arrays.

Índices de várias chaves


No MongoDB, você pode indexar um campo de matriz para criar uma entrada de índice para cada elemento da matriz. O índice resultante é chamado de índice ‘multikey’. Índices multichave podem ser criados sobre valores escalares ou documentos incorporados. Para mais informações sobre índices multichave, consulte esta documentação.

Índices multichave, embora úteis, têm várias limitações:
  • Se você criar um índice composto de várias chaves, terá no máximo um campo que é uma matriz.
  • Um índice composto não pode ser uma chave de fragmentação.
  • Um índice composto não pode ser um índice com hash.
Limitações do Índice Multikey do MongoDB - O que procurar em suas consultasClick To Tweet
Um dos aspectos mais interessantes dos índices multichave é como os limites de interseção do índice são calculados.

Indexar limites de interseção


Aqui está como a documentação do MongoDB define os limites de interseção do índice:

“Os limites de uma varredura de índice definem as partes de um índice a serem pesquisadas durante uma consulta. Quando houver vários predicados em um índice, o MongoDB tentará combinar os limites desses predicados por meio de interseção ou composição para produzir uma varredura com limites menores”.

Consultas de intervalo em matrizes


Vamos começar com um exemplo simples para ver como o MongoDB calcula limites de índice para consultas em arrays. Suponha que temos os três documentos a seguir em uma coleção:
{x:65}{x:35}{x:[12,95]}

Emitimos a seguinte consulta:
db.coll.find({x :{ $gt :22, $lt:55})

A consulta é bastante simples. Você esperaria que a resposta fosse {x:35}, mas a consulta retorna:
{x:35}{x:[25,95]}

A razão vem de como o MongoDB lida com arrays. O mesmo elemento da matriz não precisa corresponder a ambas as condições; contanto que haja um elemento que corresponda a cada condição, é uma correspondência. Então, neste caso, os limites são [22, Infinity] e [-Infinity, 55]. Como um operador ‘elemMatch’ não é usado, o MongoDB não usa a interseção de índice. O MongoDB não especifica qual desses intervalos [22, Infinity] ou [-Infinity, 55] será usado para a execução da consulta.

Se quisermos usar a interseção de índice, precisamos usar a seguinte consulta:
db.coll.find(x :{ $elemMatch:{$gt :22,$lt:55}})

Quando você usa isso, o MongoDB cruza os limites do índice e usa [22, 55] como os limites. Como esperado, esta consulta não retorna nenhum resultado (elemMatch não corresponde a não matrizes). Então, essencialmente, as consultas de intervalo em matrizes são bastante inúteis sem o operador $elemMatch.

Índices compostos de várias chaves – Misturando campos de matriz e não matriz


Considere uma coleção com os seguintes documentos:
{item:35, preços:[250,35]}......{item:106, preços:[1500,65]}

Adicionaremos um índice composto nesta coleção:
db.ensureIndex({item:1, preços:1});

Agora vamos executar uma consulta simples:
db. col. find({item:{$gt:12, $lt:65}});

A consulta parece bastante simples, pois estamos usando um item não array com um intervalo fixo. Espero que os limites de interseção do índice sejam algo como item:[[12,65] ] para a consulta, no entanto, se você executar uma explicação, verá isso:
"indexBounds" :{"item" :[ [ -Infinity, 65 ] ]"prices" :[ [ { "$minElement" :1 }, { "$maxElement" :1 } ] ]}, 
O motivo é que o MongoDB detecta que este é um índice multichave e não processa a interseção de limites de índice, independentemente do fato de sua consulta não estar usando nenhum campo de matriz. A moral da história é que, quando você mistura campos de matriz e não matriz em um índice, sempre fique de olho nos limites de interseção do índice. As probabilidades são de que não é eficiente.