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.
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.
Por exemplo, os documentos em uma collection movies contêm um campo genres : uma array de gêneros associados a cada filme. Você consulta regularmente filmes que têm gêneros específicos, como encontrar todos os filmes que são Drama e Action.
Você pode criar um índice no campo genres para melhorar o desempenho desta query. Como o genres 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.
Os exemplos nesta página usam dados do conjunto de dados de amostra sample_mflix. Para obter detalhes sobre como carregar esse conjunto de dados em sua implantação autogerenciada do MongoDB , consulte Carregar o conjunto de dados de amostra. Se você fez modificações nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.
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.
Se já existir um índice de múltiplas chaves composto, não será possível inserir um documento que viole essa restrição.
Por exemplo, você pode criar um índice composto de várias chaves { genres: 1, year: 1
} na collection movies 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 campos genres e year.
Entretanto, depois de criar o índice de múltiplas chaves composto, se você tentar inserir um documento em que os campos genres e year 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 na memória, 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
Índices de múltiplas chaves podem cobrir consultas quando estas condições são atendidas:
A consulta não retorna o campo de array (o que significa que a array não está incluída na projeção da consulta). Isso significa que, para cobrir uma consulta, o índice multichave deve ser composto.
A consulta não inclui
$elemMatch.A consulta atende a todos os outros requisitos de consulta cobertos.
Por exemplo, a seguinte operação cria um índice composto de múltiplas chaves na collection movies nos campos genres e title:
db.movies.createIndex( { genres: 1, title: 1 } )
O índice anterior é multichave porque o campo genres contém valores de array.
O índice cobre estas queries:
db.movies.find( { genres: 'Drama' }, { _id: 0, title: 1 } ).sort({ genres: 1 }).limit(5)
db.movies.find( { title: 'The Ace of Hearts', genres: 'Drama' }, { _id: 0, title: 1 } )
O índice não abrange a seguinte query porque a projeção contém o campo de array genres:
db.movies.find( { genres: 'Drama' }, { _id: 0, genres: 1 } ).limit(5)
Query em um campo de array como um todo
Quando uma query especifica uma correspondência exata para uma array como um todo, o MongoDB usa o índice de várias chaves para localizar documentos que contêm o primeiro elemento dessa array. No entanto, ele não pode corresponder a toda a array usando apenas o índice. Em seguida, o MongoDB obtém os documentos candidatos e os filtra para retornar apenas aqueles cuja array corresponde exatamente à array da query.
Por exemplo, a seguinte operação cria um índice de múltiplas chaves na collection movies no campo genres:
db.movies.createIndex( { genres: 1 } )
A query a seguir procura documentos onde o campo genres é a array [ "Drama" ]:
db.movies.find( { genres: 'Drama' }, { title: 1, genres: 1 } ).limit(5)
O MongoDB pode usar o índice de várias chaves para encontrar documentos que tenham "Drama" em qualquer posição na array genres. Em seguida, o MongoDB recupera esses documentos e filtra os documentos cuja array genres seja igual à array da query [ "Drama" ].
$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: