Multikey Indexes
Nesta página
Os índices de várias chaves coletam e classificam dados de campos que contêm valores de array. Os índices de várias chaves melhoram o desempenho de consultas em campos de array.
Não é preciso especificar explicitamente o tipo de múltiplas chaves. Ao criar um índice em um campo que contém um valor de array, o MongoDB define automaticamente esse índice como um índice de múltiplas chaves.
O MongoDB pode criar índices de múltiplas chaves em arrays que contêm valores escalares (por exemplo, strings e números) e documentos incorporados. Se uma array contiver várias instâncias do mesmo valor, o índice incluirá apenas uma entrada para o valor.
Para criar um índice de múltiplas chaves, use o seguinte protótipo:
db.<collection>.createIndex( { <arrayField>: <sortOrder> } )
Esta imagem mostra um índice de múltiplas chaves no campo addr.zip
:
Você pode criar e gerenciar índices de múltiplas chaves na IU para implantações hospedadas no MongoDB Atlas.
Casos de uso
Se seu aplicativo consulta frequentemente um campo que contém um valor de array, um índice de múltiplas chaves melhora o desempenho dessas queries.
A indexação de campos comumente sujeitos a queries aumenta as chances de abranger essas queries. As queries abrangidas são queries que podem ser totalmente satisfeitas usando um índice, sem examinar nenhum documento. Isso otimiza o desempenho da query.
Por exemplo, os documentos em uma collection students
contêm um campo test_scores
: uma array de pontuações de testes que um aluno recebeu ao longo do semestre. Você atualiza regularmente uma lista dos melhores alunos: alunos que têm pelo menos cinco test_scores
maiores que 90
.
Você pode criar um índice no campo test_scores
para melhorar o desempenho desta query. Como o test_scores
contém um valor de array, o MongoDB armazena o índice como um índice de múltiplas chaves.
Começar
Para criar um índice de múltiplas chaves, consulte:
Detalhes
Esta seção descreve detalhes técnicos e limitações para índices de múltiplas chaves.
Limites do Índice
Os limites de uma varredura de índice definem as partes de um índice a serem pesquisadas durante uma consulta. O cálculo dos limites do índice de multichaves segue regras especiais. Para obter detalhes, consulte Limites de índice multichave.
Unique Multikey Indexes
Em um índice de múltiplas chaves único, um documento pode ter elementos de array que resultam na repetição dos valores de chaves de índices, desde que os valores de chaves de índices desse documento não dupliquem os de outro documento.
Para saber mais e ver um exemplo desse comportamento, consulte Restrição exclusiva em documentos separados.
Índices de múltiplas chaves compostos
Em um índice composto de várias chaves, cada documento indexado pode ter no máximo um campo indexado cujo valor é uma array. Especificamente:
Você não poderá criar um índice composto de várias chaves se mais de um campo na especificação do índice for uma array. Por exemplo, considere uma collection que contenha este documento:
{ _id: 1, scores_spring: [ 8, 6 ], scores_fall: [ 5, 9 ] } Não é possível criar o índice de múltiplas chaves composto
{ scores_spring: 1, scores_fall: 1 }
porque ambos os campos no índice são arrays.Se já existir um índice de múltiplas chaves composto, não será possível inserir um documento que viole essa restrição.
Considere uma coleta que contenha estes documentos:
{ _id: 1, scores_spring: [8, 6], scores_fall: 9 } { _id: 2, scores_spring: 6, scores_fall: [5, 7] } Você pode criar um índice composto de várias chaves
{ scores_spring: 1, scores_fall: 1 }
porque, para cada documento, apenas um campo indexado pelo índice composto de várias chaves é uma array. Nenhum documento contém valores de array para os camposscores_spring
escores_fall
.Entretanto, depois de criar o índice de múltiplas chaves composto, se você tentar inserir um documento em que os campos
scores_spring
escores_fall
sejam arrays, a inserção falhará.
Classificação
Quando você classifica com base em um campo de array indexado com um índice de várias chaves, o plano de consulta inclui um estágio de classificação de bloqueio , a menos que ambos os itens a seguir sejam verdadeiros:
Os limites do índice para todos os campos de classificação são
[MinKey, MaxKey]
.Nenhum limite de qualquer campo indexado por várias chaves tem o mesmo prefixo de caminho que o padrão de classificação.
Chaves de fragmentação
Não é possível especificar um índice de múltiplas chaves como um índice de chave de fragmento.
No entanto, se o índice da chave de fragmento for um prefixo de um índice composto, o índice composto poderá se tornar um índice composto de várias chaves se uma das chaves finais (que não fazem parte da chave do fragmento) indexar uma array.
Índices com hash
Os índices hash não podem ser multichave.
Queries cobertas
Os índices de múltiplas chaves podem cobrir as queries quando estas condições são atendidas:
A query não retorna o campo de array (o que significa que a array não está incluída na projeção da query). Isso significa que, para cobrir uma query, o índice de várias chaves deve ser composto.
A query não inclui
$elemMatch
.A query atende a todos os outros requisitos de query cobertos.
Por exemplo, considere uma collection matches
com estes documentos:
db.matches.insertMany( [ { name: "Joe", event: [ "open", "tournament" ] }, { name: "Bill", event: [ "match", "championship" ] } ] )
A coleta matches
tem um índice composto de várias chaves nos campos event
e name
:
db.matches.createIndex( { event: 1, name: 1 } )
O índice anterior é multichave porque o campo event
contém valores de array.
O índice cobre estas queries:
db.matches.find( { event: 'championship' }, { _id: 0, name: 1 } ) db.matches.find( { name: 'Bill', event: 'championship' }, { _id: 0, name: 1 } )
O índice não cobre a seguinte query porque a projeção contém o campo de array event
:
db.matches.find( { event: 'championship' }, { _id: 0, event: 1 } )
Query em um campo de array como um todo
Quando um filtro de consulta especifica uma correspondência exata para uma array como um todo, o MongoDB pode usar o índice de várias chaves para procurar o primeiro elemento da array de consulta, mas não pode usar a verificação de índice de várias chaves para localizar a array inteira.
Em vez disso, depois de usar o índice de múltiplas chaves para procurar o primeiro elemento da query de array, o MongoDB recupera os documentos associados e filtra documentos cuja array corresponde à array na query.
Por exemplo, considere uma collection inventory
que contenha estes documentos:
db.inventory.insertMany( [ { _id: 5, type: "food", item: "apple", ratings: [ 5, 8, 9 ] } { _id: 6, type: "food", item: "banana", ratings: [ 5, 9 ] } { _id: 7, type: "food", item: "chocolate", ratings: [ 9, 5, 8 ] } { _id: 8, type: "food", item: "fish", ratings: [ 9, 5 ] } { _id: 9, type: "food", item: "grapes", ratings: [ 5, 9, 5 ] } ] )
A collection inventory
tem um índice de múltiplas chaves no campo ratings
:
db.inventory.createIndex( { ratings: 1 } )
A query a seguir procura documentos onde o campo ratings
é a array [ 5, 9 ]
:
db.inventory.find( { ratings: [ 5, 9 ] } )
O MongoDB pode usar o índice de várias chaves para encontrar documentos que tenham 5
em qualquer posição na array ratings
. Em seguida, o MongoDB recupera esses documentos e filtra os documentos cuja array ratings
seja igual à array da query [ 5, 9 ]
.
$expr
O operador $expr
não suporta índices de múltiplas chaves.
Saiba mais
Para saber como o MongoDB combina limites de índice de várias chaves para melhorar o desempenho, consulte Limites de índice de várias chaves.
Para saber como consultar campos de array, consulte: