Incluir ou excluir campos em um índice curinga
Nesta página
Ao criar um índice curinga, você pode especificar campos a serem incluídos ou excluídos no índice. Isso permite que você:
Crie um índice curinga que abranja apenas campos específicos. Por exemplo, se você tiver vários documentos incorporados com vários subcampos, poderá criar um índice para abranger consultas tanto em documentos incorporados quanto em seus subcampos.
Crie um índice curinga que omita campos específicos. Por exemplo, se tiver uma coleção que contenha um campo que nunca seja consultado, você poderá omitir esse campo do índice.
Para incluir ou excluir campos em um índice curinga, especifique os campos escolhidos na opção wildcardProjection
:
db.<collection>.createIndex( { "$**" : <sortOrder> }, { "wildcardProjection" : { "<field1>" : < 0 | 1 >, "<field2>" : < 0 | 1 >, ... "<fieldN>" : < 0 | 1 > } } )
No documento wildcardProjection
, o valor 0
ou 1
indica se o campo está incluído ou excluído no índice:
0
significa que o campo foi excluído.1
significa que o campo está incluído.
Restrições
Para usar a opção
wildcardProjection
, sua chave de índice deve ser$**
.Os índices curinga não suportam a combinação de declarações de inclusão e exclusão no documento
wildcardProjection
, exceto quando se inclui explicitamente o campo_id
. Por exemplo:O seguinte documento
wildcardProjection
é inválido porque especifica uma inclusão e uma exclusão de um campo:{ "wildcardProjection" : { "attributes" : 0, "users" : 1 } } O seguinte documento
wildcardProjection
é válido porque, embora especifique a inclusão e a exclusão, ele inclui o campo_id
:{ "wildcardProjection" : { "attributes" : 0, "_id" : 1 } }
Antes de começar
Crie uma coleção de products
que contenha os seguintes documentos:
db.products.insertMany( [ { "item": "t-shirt", "price": "29.99", "attributes": { "material": "cotton", "color": "blue", "size": { "units": "cm", "length": 74 } } }, { "item": "milk", "price": "3.99", "attributes": { "sellBy": "02-06-2023", "type": "oat" } }, { "item": "laptop", "price": "339.99", "attributes": { "memory": "8GB", "size": { "units": "inches", "height": 10, "width": 15 } } } ] )
Cada documento possui um campo attributes
que contém detalhes do produto. Os subcampos de attributes
variam dependendo do produto.
Procedimentos
Você pode usar a opção wildcardProjection
para:
Incluir Campos Específicos em um Índice Curinga
Se você query com frequência determinados campo de documento, pode especificar esses campo em um wildcardProjection
para dar suporte a essas query sem adicionar inchaço desnecessário ao índice.
A seguinte operação cria um índice curinga que contém todos os valores escalares (ou seja, strings e números) dos campos attributes.size
e attributes.color
:
db.products.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "attributes.size" : 1, "attributes.color" : 1 } } )
Resultados
Enquanto o padrão de chave "$**"
abrange todos os campos do documento, o campo wildcardProjection
limita o índice apenas aos campos incluídos.
Se um campo for um documento incorporado ou array (como attributes.size
), o índice curinga recorrerá ao campo e indexará todos os valores de campo escalar incorporado.
O índice criado suporta queries sobre qualquer valor escalar incluído no objeto wildcardProjection
. Por exemplo, o índice oferece suporte a estas queries:
db.products.find( { "attributes.size.height" : 10 } ) db.products.find( { "attributes.color" : "blue" } )
O índice não suporta queries em campos não incluídos no wildcardProjection
, como esta query:
db.products.find ( { "item": "milk" } )
Excluir campos específicos de um índice curinga
Se houver campo de documento que você raramente faz query, poderá criar um índice curinga que omite esses campo.
A seguinte operação cria um índice curinga em todos os campos do documento na collection products
, mas omite o campo attributes.memory
do índice:
db.products.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "attributes.memory" : 0 } } )
Resultados
Enquanto o padrão de chave "$**"
abrange todos os campos no documento, o campo wildcardProjection
exclui valores attributes.memory
do índice.
Se um campo for um documento incorporado ou array (como attributes.size
), o índice curinga recorrerá ao campo e indexará todos os valores de campo escalar incorporado.
Por exemplo, o índice aceita estas queries:
db.products.find( { "attributes.color" : "blue" } ) db.products.find( { "attributes.size.height" : 10 } )
O índice não suporta query no attributes.memory
, porque este campo foi omitido do índice.
Saiba mais
Para saber como usar a projeção curinga com um índice composto curinga para filtrar campos, consulte Filtrar campos com um wildcardProjection
.
Para saber mais sobre comportamentos e casos de uso de índices curinga, consulte: