Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

Índices compostos

Nesta página

  • Compatibilidade
  • Criar um índice composto
  • Ordem de classificação
  • Prefixos
  • Interseção de índice
  • Índices de compostos esparsos
  • Considerações adicionais

O MongoDB suporta índices compostos, onde uma única estrutura de índice contém referências a vários campos [1] dentro dos documentos de uma coleção. O diagrama a seguir ilustra um exemplo de um índice composto em dois campos:

Diagrama de um índice composto no campo ``userid`` (ascendente) e no campo ``score`` (decrescente). O índice classifica primeiro pelo campo ``userid`` e depois pelo campo ``score``.
[1] O MongoDB impõe um limite de 32 campos para qualquer índice composto.

O índice composto pode suportar query que correspondem em vários campo.

Você pode utilizar índices compostos para implantações hospedadas no MongoDB Atlas.

Para saber mais sobre como gerenciar índices para distribuições hospedadas no MongoDB Atlas, consulte Criar, visualizar, descartar e ocultar índices.

Para criar um índice composto, use uma operação semelhante ao protótipo a seguir:

db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )

O valor do campo na especificação do índice descreve o tipo de índice para este campo. Por exemplo, um valor de 1 especifica um índice que ordena os itens em ordem crescente. Um valor de -1 especifica um índice que ordena os itens em ordem decrescente. Para tipos de índice adicionais, consulte tipos de índice.

A ordem dos campos indexados tem um forte impacto na eficácia de um índice específico para uma determinada query. Para a maioria dos índices compostos, seguir a regra ESR (Equality, Sort, Range) ajuda a criar índices eficientes.

Importante

Começando no MongoDB 4.4:

No MongoDB 4.2 ou anterior:

Considere uma collection chamada products que contenha documento que se assemelham ao seguinte documento:

{
"_id": ObjectId(...),
"item": "Banana",
"category": ["food", "produce", "grocery"],
"location": "4th Street Store",
"stock": 4,
"type": "cases"
}

A seguinte operação cria um índice ascendente nos campos item e stock :

db.products.createIndex( { "item": 1, "stock": 1 } )

A ordem dos campos listados em um índice composto é importante. O índice conterá referências a documentos classificados primeiro pelos valores do campo item e, dentro de cada valor do campo item , classificados pelos valores do campo ações. Consulte Ordem de classificação para obter mais informações.

Além de oferecer suporte a query que correspondem a todos os campo de índice, o índice composto podem oferecer suporte a query que correspondem ao prefixo dos campo de índice. Ou seja, o índice suporta query no campo item , bem como nos campo item e stock :

db.products.find( { item: "Banana" } )
db.products.find( { item: "Banana", stock: { $gt: 5 } } )

Para obter detalhes, consulte Prefixos.

Os índices armazenam referências a campos em ordem de classificação crescente (1) ou decrescente (-1). Para índices de campo único, a ordem de classificação das chaves não importa porque o MongoDB pode percorrer o índice em qualquer direção. No entanto, para índices compostos, a ordem de classificação pode ser importante para determinar se o índice pode suportar uma operação de classificação.

Considere uma collection events que contenha documento com o campo username e date. A aplicação pode emitir query que retornam resultados classificados primeiro por username valores crescentes e, em seguida, por valores decrescentes (ou seja, do mais recente para odate último), como:

db.events.find().sort( { username: 1, date: -1 } )

ou query que retornam resultados classificados primeiro por valores username decrescentes e, em seguida, por valores date crescentes, como:

db.events.find().sort( { username: -1, date: 1 } )

O índice a seguir pode oferecer suporte a ambas as operações de classificação:

db.events.createIndex( { "username" : 1, "date" : -1 } )

No entanto, o índice acima não pode suportar uma classificação por valores username crescentes e, em seguida, por valores date crescentes, como o seguinte:

db.events.find().sort( { username: 1, date: 1 } )

Para obter mais informações sobre ordem de classificação e índices compostos, consulte Usar índices para classificar resultados de query.

Os prefixos de índices são os subconjuntos iniciais de campos indexados. Por exemplo, considere o seguinte índice composto:

{ "item": 1, "location": 1, "stock": 1 }

O índice tem os seguintes prefixos de índice:

  • { item: 1 }

  • { item: 1, location: 1 }

Para um índice composto, o MongoDB pode usar o índice para oferecer suporte a query sobre os prefixos do índice. Dessa forma, o MongoDB pode usar o índice para query nos seguintes campo:

  • o campo item,

  • o campo item e o campo location ,

  • o campo item e o campo location e o campo stock .

O MongoDB também pode usar o índice para suportar uma query nos campos item e stock , já que o campo item corresponde a um prefixo. No entanto, nesse caso, o índice não seria tão eficiente no suporte à query quanto seria se o índice estivesse apenas em item e stock.

Como uma query em item e stock omite o prefixo de índice location , ela não pode usar o campo de índice stock que segue location. Somente o campo item no índice pode suportar essa query. Consulte Criar índices para oferecer suporte a sua query para obter mais informações. O índice:

  1. Corresponde às chaves para item.

  2. Executa um filtro dentro do estágio IXSCAN no campo stock .

  3. Retorna o resultado filtrado.

Por exemplo, considere uma query para "item": "saccharomyces cerevisiae" e "stock": 60. Se a collection contiver 10.000 documentos correspondentes a "item": "saccharomyces cerevisiae" e apenas 100 desses documentos correspondentes a "stock": 60, a query examinará 10.000 chaves. No estágio IXSCAN , a query filtra essas chaves pelo campo stock e retorna apenas 100 resultados para o próximo estágio.

O MongoDB não pode usar o índice para suportar query que incluem os seguinte campo, pois sem o campo item , nenhum dos campo listados corresponde a um índice de prefixo:

  • o campo location,

  • o campo stock, ou

  • os campos location e stock.

Se você tiver uma collection que tenha um índice composto e um índice em seu prefixo (por exemplo, { a: 1, b: 1 } e { a: 1 }), se nenhum índice tiver uma restrição esparsa ou única, então você poderá remover o índice no prefixo (por exemplo { a: 1 }). O MongoDB usará o índice composto em todas as situações que teria usado o índice prefixo.

A partir da versão 2.6, o MongoDB pode usar a interseção de índices para atender a consultas. A escolha entre criar índice composto que suporte suas query ou confiar na interseção de índices depende das especificidades do seu sistema. Consulte Interseção de índices e índices compostos para obter mais detalhes.

Os índices compostos podem conter diferentes tipos de índices esparsos. A combinação de tipos de índice determina como o índice composto corresponde aos documentos.

Esta tabela resume o comportamento de um índice composto que contém diferentes tipos de índices esparsos:

Componentes do índice composto
Comportamento do índice composto
Índices crescentes
Índices decrescentes
Somente indexa documentos que contêm um valor para pelo menos uma das chaves.
Índices crescentes
Índices decrescentes
Indexa um documento somente quando ele contém um valor para um dos campos geospatial. Não indexa documentos nos índices crescentes ou decrescentes.
Índices crescentes
Índices decrescentes
Somente indexa um documento quando ele corresponde a um dos campostext. Não indexa documentos nos índices crescentes ou decrescentes.

Durante a criação de índices, os aplicativos podem encontrar desempenho reduzido ou acesso limitado de leitura/gravação à coleção que está sendo indexada.

Para obter mais informações sobre o processo de construção de índices, consulte Construções de índices em collection preenchidas, especialmente a seção Construções de índices em ambientes replicados .

Alguns drivers usam NumberLong(1) em vez de 1 para especificar a ordem do índice. Os índices resultantes são os mesmos.

← Índices de campo único