Índices compostos de curingas
Nesta página
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.
Casos de uso
pesquisar usando o padrão de atributo
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.
Comportamento
Para criar índices curinga, utilize um comando de criação de índice padrão:
Considerações gerais para índices curinga
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 documentowildcardProjection
.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.
Considerações sobre o índice curinga composto
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
).
Começar
Filtrar campos com uma wildcardProjection
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 $**
.
Usar um método auxiliar para criar um índice curinga
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
.