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

Índices compostos de curingas

Nesta página

  • Casos de uso
  • pesquisar usando o padrão de atributo
  • Comportamento
  • Considerações gerais para índices curinga
  • Considerações sobre o índice curinga composto
  • Começar
  • Filtrar campos com uma wildcardProjection
  • Usar um método auxiliar para criar um índice curinga
  • Saiba mais

Novidades na versão 7.0.

O MongoDB oferece suporte à criação de índices curinga em um campo ou em um conjunto de campos. Um índice composto tem vários termos de índice. Um índice curinga composto tem um termo curinga e um ou mais termos de índice adicionais.

Importante

Os índices curinga não substituem o planejamento de índice baseado em volume de trabalho.

Para obter mais informações sobre como criar índices que suportem seu volume de trabalho, consulte Crie índices para dar suporte a suas queries.

Opadrão de atributo é uma técnica útil para pesquisar documentos que compartilham características comuns.

Infelizmente, é caro criar muitos índices individuais para cobrir todas as query possíveis. Um índice curinga é uma boa alternativa para criar um grande número de índices individuais, pois um índice curinga pode cobrir com eficiência muitas query em potencial.

Considere um esquema como:

{
tenantId: <Number>,
tenantRegion: <Number>,
customFields: {
addr: <String>,
name: <String>,
blockId: <Number>,
...
}
dateOpened: <Date>
}

Talvez você queira consultar aspectos do campo customFields para locatários que tenham um tenantId específico. Você pode criar uma série de índices individuais:

{ tenantId: 1, “customFields.addr": 1 }
{ tenantId: 1, “customFields.name": 1 }
{ tenantId: 1, “customFields.blockId": 1 }
...

Essa abordagem é difícil de manter e é provável que você atinja o número máximo de índices por collection (64).

Em vez disso, use um índice curinga composto. O índice curinga composto é mais fácil de escrever, mais fácil de manter e é improvável que atinja o limite de collection de 64 índices.

Este exemplo cria um índice curinga composto na collection salesData :

db.runCommand(
{
createIndexes: "salesData",
indexes: [
{
key: {
tenantId: 1,
"customFields.$**": 1
},
name: "tenant_customFields"
}
]
}
)

O curinga, "customFields.$**", especifica todos os subcampos no campo customFields . O outro termo do índice, tenantId, não é uma especificação curinga; é uma especificação de campo padrão.

Para criar índices curinga, utilize um comando de criação de índice padrão:

  • Os índices curinga omitem o campo _id por padrão. Para incluir o campo _id em um índice curinga, você deve explicitamente incluí-lo no documento wildcardProjection .

    db.salesData.createIndex(
    { "$**" : 1 },
    { "wildcardProjection" :
    { "_id": 1, "customers.lastName": 1, "customers.FirstName": 1, }
    }
    )
  • É possível criar mais de um índice curinga em uma collection.

  • Um índice curinga pode cobrir os mesmos campos que outros índices na collection.

  • Os índices curinga são escassos. Elas incluem apenas entradas para documentos que contêm o campo indexado.

    O documento não será indexado se todos os campos no índice curinga composto estiverem ausentes.

  • Os índices curinga compostos são índices esparsos.

  • Os documentos serão incluídos no índice se não tiverem o campo curinga, mas tiverem um dos campos compostos.

  • Os campos de índice, incluindo campos curinga, podem ser classificados em ordem crescente (1) ou decrescente (-1).

Você pode utilizar um wildcardProjection para especificar subcampo individuais.

db.runCommand(
{
createIndexes: "salesData",
indexes: [
{
key: {
tenantId: 1,
"$**": 1
},
name: "tenant_customFields_projection",
wildcardProjection: {
"customFields.addr": 1,
"customFields.name": 1
}
}
]
}
)

O termo do índice curinga, "$**", especifica cada campo na collection. O wildcardProjection limita o índice aos campos especificados, "customFields.addr" e "customFields.name".

Você só pode usar um wildcardProjection quando o termo curinga for $**.

O MongoDB fornece assistente de shell para a maioria dos reconhecimento de data center. Estes métodos de shell oferecem uma sintaxe simplificada e são funcionalmente equivalentes ao reconhecimento de data center.

O auxiliar de shell para o primeiro exemplo é:

db.salesData.createIndex(
{ tenantId: 1, "customFields.$**": 1 },
{
name: "tenant_customFields_shellHelper"
}
)

O assistente de shell para o segundo exemplo é:

db.salesData.createIndex(
{ tenantId: 1, "$**": 1 },
{ "wildcardProjection": {
"customFields.addr": 1,
"customFields.name": 1
},
name: "tenant_customFields_projection_helper"
}
)

Se você quiser comparar os comandos do shell e os banco de dados, deverá eliminar os índices entre as invocações de comando. Você não pode criar o mesmo índice duas vezes, mesmo com nomes diferentes.

Para eliminar um índice, insira o nome do índice e execute db.collection.dropIndex().

db.salesData.dropIndex( "tenant_customFields" )

O comando anterior remove o índice "tenant_customFields" do reconhecimento de data center salesData .

← Criar um Índice Curinga em Todos os Campos