Multikey Indexes
Nesta página
Para indexar um campo que contém um valor de array, o MongoDB cria uma chave de índice para cada elemento exclusivo no array. Esses índices de múltiplas chaves suportam query eficientes em relação a campo de array. Índices de múltiplas chaves podem ser construídos sobre arrays que contêm valores escalares [1] (por exemplo strings, números) e documentos aninhados. Se uma array contiver várias instâncias do mesmo valor, o índice incluirá apenas uma entrada para os valores.
[1] | Um valor escalar refere-se ao valor que não é um documento incorporado nem uma array. |
Compatibilidade
Você pode utilizar índices de múltiplas chaves para sistemas hospedados no MongoDB Atlas.
Para saber mais sobre como gerenciar índices para distribuições hospedadas no MongoDB Atlas, consulte Criar, visualizar, descartar e ocultar índices.
Criar índice de múltiplas chaves
Para criar um índice de múltiplas chaves, use o método db.collection.createIndex()
:
db.coll.createIndex( { <field>: < 1 or -1 > } )
O MongoDB cria automaticamente um índice de múltiplas chaves se qualquer campo indexado for uma array; você não precisa especificar explicitamente o tipo de múltiplas chaves.
Observação
Apenas para os mecanismos de armazenamento WiredTiger e In-memory,
Para índices de múltiplas chaves, o MongoDB controla quais campos indexados fazem com que um índice seja um índice de múltiplas chaves. O rastreamento dessas informações permite que o mecanismo de query do MongoDB use limites de índice mais rígidos.
Limites do Índice
Se um índice for de múltiplas chaves, o cálculo dos limites do índice segue regras especiais. Para obter detalhes sobre os limites do índice de múltiplas chaves, consulte Limites do índice de múltiplas chaves.
Índice de múltiplas chaves único
Para índices únicos , a restrição única se aplica a documentos separados na collection e não a um único documento.
Como a restrição exclusiva se aplica a documentos separados, para um índice exclusivo de várias chaves , um documento pode ter elementos de array que resultam na repetição de valores de chave de índice, desde que os valores de chave de índice desse documento não dupliquem os de outro documento.
Para obter mais informações, consulte Restrição exclusiva em documentos separados.
Limitações
Índices de múltiplas chaves compostos
Para um índice composto de várias chaves, cada documento indexado pode ter no máximo um campo indexado cujo valor é uma array. Ou seja:
Você não poderá criar um índice composto de várias chaves se mais de um campo a ser indexado de um documento for uma array. Por exemplo, considere uma collection que contenha o seguinte documento:
{ _id: 1, a: [ 1, 2 ], b: [ 1, 2 ], category: "AB - both arrays" } Não é possível criar um índice composto de várias chaves
{ a: 1, b: 1 }
na collection, pois os camposa
eb
são arrays.Ou, se já existir um índice composto de várias chaves, você não poderá inserir um documento que viole essa restrição.
Considere uma collection que contenha os seguintes documento:
{ _id: 1, a: [1, 2], b: 1, category: "A array" } { _id: 2, a: 1, b: [1, 2], category: "B array" } Um índice composto de várias chaves
{ a: 1, b: 1 }
é permitido, pois para cada documento, apenas um campo indexado pelo índice composto de várias chaves é uma array; ou seja, nenhum documento contém valores de array para os camposa
eb
.No entanto, após criar o índice de múltiplas chaves composto, se você tentar inserir um documento em que os campos
a
eb
sejam arrays, o MongoDB falhará na inserção.
Se um campo for uma array de documentos, você poderá indexar os campos incorporados para criar um índice composto. Por exemplo, considere uma collection que contenha os seguintes documentos:
{ _id: 1, a: [ { x: 5, z: [ 1, 2 ] }, { z: [ 1, 2 ] } ] } { _id: 2, a: [ { x: 5 }, { z: 4 } ] }
Você pode criar um índice composto em { "a.x": 1, "a.z": 1 }
. A restrição em que no máximo um campo indexado pode ser uma array também se aplica.
Para obter um exemplo, consulte Indexar arrays com documentos incorporados.
Classificação
Como resultado de alterações no comportamento de classificação em campos de array no MongoDB 4.4, quando você classifica em uma array indexada com um índice de várias chaves , o plano de query inclui um estágio de ordenador bloqueante , a menos que:
Os limites do índice para todos os campos de classificação são
[MinKey, MaxKey]
eNenhum 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 o í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 outras chaves (ou seja, chaves que não fazem parte da chave de fragmento) indexa uma array. Índices compostos de várias chaves podem ter um impacto no desempenho.
Índices com hash
Os índices hash não podem ser multichave.
Queries cobertas
Os índices com várias chaves não podem cobrir queries sobre o(s) campo(s) de array.
Os índices de múltiplas chaves podem cobrir a query coberta sobre os campo que não são da array se o índice acompanhar qual campo ou campo faz com que o índice seja de múltiplas chaves.
query no campo de Array como um todo
Quando uma query 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 query, 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 os seguintes documentos:
{ _id: 5, type: "food", item: "aaa", ratings: [ 5, 8, 9 ] } { _id: 6, type: "food", item: "bbb", ratings: [ 5, 9 ] } { _id: 7, type: "food", item: "ccc", ratings: [ 9, 5, 8 ] } { _id: 8, type: "food", item: "ddd", ratings: [ 9, 5 ] } { _id: 9, type: "food", item: "eee", ratings: [ 5, 9, 5 ] }
A coleta 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
$expr
não suporta índices de múltiplas chaves.
Exemplos
Indexar arrays básicas
Criar uma collection survey
com o seguinte documento:
db.survey.insertOne( { _id: 1, item: "ABC", ratings: [ 2, 5, 9 ] } )
Criar um índice no campo ratings
:
db.survey.createIndex( { ratings: 1 } )
Como o campo ratings
contém uma array, o índice em ratings
é multichave. O índice de múltiplas chaves contém as seguintes três chaves de índice, cada uma apontando para o mesmo documento:
2
,5
, e9
.
Arrays de índice com documentos incorporados
Você pode criar índices de múltiplas chaves em campos de array que contêm objetos aninhados.
Considere uma collection inventory
com documento da seguinte forma:
{ _id: 1, item: "abc", stock: [ { size: "S", color: "red", quantity: 25 }, { size: "S", color: "blue", quantity: 10 }, { size: "M", color: "blue", quantity: 50 } ] } { _id: 2, item: "def", stock: [ { size: "S", color: "blue", quantity: 20 }, { size: "M", color: "blue", quantity: 5 }, { size: "M", color: "black", quantity: 10 }, { size: "L", color: "red", quantity: 2 } ] } { _id: 3, item: "ijk", stock: [ { size: "M", color: "blue", quantity: 15 }, { size: "L", color: "blue", quantity: 100 }, { size: "L", color: "red", quantity: 25 } ] } ...
A seguinte operação cria um índice de múltiplas chaves nos campos stock.size
e stock.quantity
:
db.inventory.createIndex( { "stock.size": 1, "stock.quantity": 1 } )
O índice de múltiplas chaves composto pode suportar query com predicados que incluem ambos os campo indexados, bem como predicados que incluem apenas o prefixo de índice "stock.size"
, como nos exemplos a seguir:
db.inventory.find( { "stock.size": "M" } ) db.inventory.find( { "stock.size": "S", "stock.quantity": { $gt: 20 } } )
Para obter detalhes sobre como o MongoDB pode combinar limites de índices de várias chaves, consulte Limites de índices de várias chaves. Para obter mais informações sobre o comportamento de índice composto e prefixos compostos, consulte Índices e prefixos compostos.
O índice composto de múltiplas chaves também pode suportar operações de classificação, como os exemplos a seguir:
db.inventory.find( ).sort( { "stock.size": 1, "stock.quantity": 1 } ) db.inventory.find( { "stock.size": "M" } ).sort( { "stock.quantity": 1 } )
Para obter mais informações sobre o comportamento de índices compostos e operações de classificação, consulte Usar índices para classificar resultados de query.