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
_idpor padrão. Para incluir o campo_idem 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 .
Criar um Índice Curinga Composto Parcial
Para criar um índice curinga composto parcial, você pode usar a partialFilterExpression opção para especificar uma expressão de filtro de forma que o índice inclua somente documentos que correspondam à condição do filtro. partialFilterExpression pode cobrir campos incluídos ou não no índice.
O exemplo a seguir cria um índice curinga composto parcial no campo tenantId e em todos os subcampos no campo customFields , somente em documentos com um tenantRegion de 1.
db.runCommand( { createIndexes: "salesData", indexes: [ { key: { tenantId: 1, "customFields.$**": 1 }, name: "tenant_customFields_partial", partialFilterExpression: { tenantRegion: 1 } } ] } )