Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ /

Índices multichave

Nesta página

  • Casos de uso
  • Começar
  • Detalhes
  • Limites do Índice
  • Índices de múltiplas chaves únicos
  • Índices de múltiplas chaves compostos
  • Classificação
  • Chaves de fragmentação
  • Índices com hash
  • Queries cobertas
  • Query em um campo de array como um todo
  • $expr
  • Saiba mais

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:

Diagrama de um índice multichave no ``addr.zip`` campo. O campo ``addr`` contém uma array de documentos de endereço. Os documentos de endereço contêm o campo ``zip``.

Você pode criar e gerenciar índices de múltiplas chaves na interface do usuário para implantações hospedadas no MongoDB Atlas.

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 cobrir essas queries. As queries cobertas 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.

Para criar um índice de múltiplas chaves, consulte:

Esta seção descreve detalhes técnicos e limitações para índices de múltiplas chaves.

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.

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.

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 campos scores_spring e scores_fall.

    Entretanto, depois de criar o índice de múltiplas chaves composto, se você tentar inserir um documento em que os campos scores_spring e scores_fall sejam arrays, a inserção falhará.

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.

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.

Os índices hash não podem ser multichave.

Os índices de múltiplas chaves não podem cobrir consultas sobre campos de array. No entanto, os índices de múltiplas chaves podem cobrir as consultas sobre os campos que não são da array se o índice acompanhar qual campo ou campos faz com que o índice seja de múltiplas chaves.

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 name e event :

db.matches.createIndex( { name: 1, event: 1 } )

Esse índice é um índice de múltiplas chaves, pois o campo event contém valores de array.

O índice de múltiplas chaves cobre a seguinte query, embora o campo correspondente (name) não seja uma array:

db.matches.find( { name: "bill" } )

Como name campo faz parte do prefixo do índice, o índice cobre consultas no campo name . O índice não pode cobrir queries em name e event, porque os índices de várias chaves não podem cobrir consultas em campos de array.

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 ].

O operador $expr não suporta índices de múltiplas chaves.

← Ordem de classificação de índices compostos