createIndexes
Nesta página
- Definição
- Compatibilidade
- Sintaxe
- Campos de comando
- Considerações
- Nomes de índice
- Conjuntos de Réplicas e Clusters Compartilhados
- Tipos de agrupamento e índice
- Stable API
- Comportamento
- Concurrency
- Limite de uso da memória
- Opções de índice
- Índices curinga
- Transações
- Quorum para o Commit Comparado com Write Concern
- Exemplo
- Criar um Índice Curinga
- Criar Índice com Commit Quorum
- Saída
Definição
createIndexes
Constrói um ou mais índices em uma coleção.
Dica
Em
mongosh
, este comando também pode ser executado por meio dos métodos de assistentedb.collection.createIndex()
edb.collection.createIndexes()
.Os métodos auxiliares são práticos para os usuários
mongosh
, mas podem não retornar o mesmo nível de informações que os comandos do banco de dados. Nos casos em que a praticidade não for necessária ou os campos de retorno adicionais forem necessários, use o comando de banco de dados.
Compatibilidade
Esse comando está disponível em implantações hospedadas nos seguintes ambientes:
MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
Observação
Este comando é aceito em todos os clusters do MongoDB Atlas. Para obter informações sobre o suporte do Atlas para todos os comandos, consulte Comandos sem suporte.
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Sintaxe
O comando createIndexes
utiliza o seguinte formulário:
db.runCommand( { createIndexes: <collection>, indexes: [ { key: { <key-value_pair>, <key-value_pair>, ... }, name: <index_name>, <option1>, <option2>, ... }, { ... }, { ... } ], writeConcern: { <write concern> }, commitQuorum: <int|string>, comment: <any> } )
Campos de comando
O comando createIndexes
utiliza os seguintes campos:
Campo | Tipo | Descrição |
---|---|---|
createIndexes | string | A coleção para a qual criar índices. |
indexes | array | Especifica os índices a serem criados. Cada documento na array especifica um índice separado. |
writeConcern | documento | Opcional. Um documento que expressa o write concern. Omitir para usar o write concern padrão. |
commitQuorum | inteiro ou string | Opcional. O número mínimo de nós do conjunto de réplicas contendo dados (ou seja, quorum para o commit), incluindo o primary, que deve relatar uma construção de índice bem-sucedida antes que o primary marque o A partir do MongoDB v5.0, você pode retomar algumas construções de índice interrompido quando o Nós do conjunto de réplicas em um quorum para o commit devem ter suporta os seguintes valores:
|
comment | any | Opcional. Um comentário fornecido pelo usuário para anexar a este comando. Depois de definido, esse comentário aparece junto com os registros desse comando nos seguintes locais:
Um comentário pode ser qualquer tipo BSON válido (string, inteiro, objeto, array etc). |
Cada documento no array indexes
contém os seguintes campos:
Campo | Tipo | Descrição | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
key | documento | Especifica os campos do índice. Para cada campo, especifique um par chave-valor no qual a chave é o nome do campo a ser indexado e o valor é a direção do índice ou o tipo de índice. Se especificar direção, especifique O MongoDB suporta vários tipos de índice diferentes, incluindo: Consulte os tipos de índice para obter mais informações. Índices Curinga suportam cargas de trabalho em que os usuários fazem query nos campos personalizados ou uma grande variedade de campos em uma coleção:
| ||||||||||
name | string | Um nome que identifica exclusivamente o índice. | ||||||||||
unique | booleano | Opcional. Cria um índice único para que a coleção não aceite a inserção ou atualização de documentos em que o valor da chave do índice corresponda a um valor existente no índice. Especifique A opção está indisponível para índices de hasheados. | ||||||||||
partialFilterExpression | documento | Opcional. Se especificado, o índice só faz referência a documentos que correspondam à expressão de filtro. Consulte Índices parciais para obter mais informações. Uma expressão de filtro pode incluir:
Se você estiver utilizando o Client-Side Field Level Encryption ou o Queryable Encryption, um Você pode especificar uma opção | ||||||||||
sparse | booleano | Opcional. Se Os seguintes tipos de índice são escassos por padrão e ignoram esta opção: Para um índice composto que inclui O MongoDB fornece a opção de criar índices parciais. Eles oferecem um superconjunto de funcionalidades de índices esparsos e são preferidos. | ||||||||||
expireAfterSeconds | inteiro | Opcional. Especifica um valor, em segundos, como um tempo de vida(TTL) para controlar por quanto tempo o MongoDB retém documentos na coleção. Esta opção se aplica somente aos índices TTL. Consulte Expirar dados de coleções configurando TTL para obter mais informações. Se você usa índices TTL criados antes do MongoDB 5.0 ou se deseja sincronizar dados criados no MongDB 5.0 com um pré-5.0 instalação, consulte Índices configurados usando NaN para evitar problemas de configuração incorreta. O valor | ||||||||||
booleano | Opcional. Uma bandeira que determina se o índice é oculto do planejador de query. Um índice oculto não é avaliado como parte da seleção do plano de query. O padrão é | |||||||||||
storageEngine | documento | Opcional. Permite que os usuários configurem o mecanismo de armazenamento por índice ao criar um índice. A opção
As opções de configuração do mecanismo de armazenamento especificadas ao criar índices são validadas e registradas no oplog durante a replicação para suportar conjuntos de réplicas com membros que usam mecanismos de armazenamento diferentes. | ||||||||||
weights | documento | Opcional. Para índices de texto, um documento que contém pares de peso e campo. O peso é um número inteiro que varia de 1 a 99.999 e denota a importância do campo em relação aos outros campos indexados em termos de pontuação. Você pode especificar pesos para alguns ou todos os campos indexados. Consulte Atribuir pesos aos resultados da pesquisa de texto em implantações autogerenciadas para ajustar as pontuações. O valor padrão é 1 . | ||||||||||
default_language | string | Opcional. Para índices de texto, o idioma que determina a lista de palavras de interrupção e as regras para o stemmer e o tokenizador. Consulte Idiomas de pesquisa de texto em implantações autogerenciadas para os idiomas disponíveis e Especificar idioma padrão para um índice de texto em implantações autogerenciadas para obter mais informações e exemplos. O valor padrão é | ||||||||||
language_override | string | Opcional. Para índices de texto, o nome do campo, nos documentos da coleção, que contém o idioma de substituição do documento. O valor padrão é language . Consulte Especificar o idioma padrão para um índice de texto em implantações autogerenciadas para obter um exemplo. | ||||||||||
textIndexVersion | inteiro | Opcional. O número da versão do índice Para ver as versões disponíveis, consulte Versões de índice de texto em implantações autogerenciadas. | ||||||||||
2dsphereIndexVersion | inteiro | Opcional. O número da versão do índice Para as versões disponíveis, consulte Índices do 2dsphere. | ||||||||||
bits | inteiro | |||||||||||
min | número | Opcional. Para índices 2d, o limite inferior inclusivo para os valores de longitude e latitude. O valor padrão é -180.0 . | ||||||||||
max | número | Opcional. Para índices 2d, o limite de inclusão superior para os valores de longitude e latitude. O valor padrão é 180.0 . | ||||||||||
collation | documento | Opcional. Especifica o agrupamento do índice. A colocação permite que os usuários especifiquem regras específicas do idioma para comparação de strings, como regras para letras maiúsculas e marcas de acento. Se você especificou um agrupamento no nível da coleção, então:
A opção de agrupamento tem a seguinte sintaxe:
Ao especificar agrupamento, o campo | ||||||||||
wildcardProjection | documento | Opcional. Permite que os usuários incluam ou excluam caminho do campo específicos de um índice curinga usando o padrão de chave A opção
O
Os índices curinga omitem o campo
Todas as declarações no documento |
mongosh
fornece os métodos db.collection.createIndex()
e db.collection.createIndexes()
como wrappers para o comando createIndexes
.
Considerações
O MongoDB não permite a criação de índices da versão 0.
Nomes de índice
O comando createIndexes
e auxiliares mongosh
, db.collection.createIndex()
e db.collection.createIndexes()
relatam um erro se você criar um índice com um nome e, em seguida, tentar criar o mesmo índice novamente, mas com outro nome.
{ "ok" : 0, "errmsg" : "Index with name: x_1 already exists with a different name", "code" : 85, "codeName" : "IndexOptionsConflict" }
Em versões anteriores, o MongoDB não recriava o índice, mas retornava um objeto de resposta com valor ok
de 1
e uma observação de que o índice não foi recriado. Por exemplo:
{ "numIndexesBefore" : 2, "numIndexesAfter" : 2, "note" : "all indexes already exist", "ok" : 1 }
Conjuntos de Réplicas e Clusters Compartilhados
Observação
Exige featureCompatibilityVersion 4.4+
Cada mongod
no conjunto de réplica ou agrupamento fragmentado deve ter featureCompatibilityVersion configurado para pelo menos 4.4
para iniciar construções de índice simultaneamente entre membros do conjunto de réplicas.
Construir índices em um conjunto de réplicas ou cluster particionado é feito simultaneamente em todos os membros do conjunto de réplicas que contêm dados. Para clusters fragmentados, a construção de índices ocorre somente em fragmentos que contêm dados para a coleção que está sendo indexada. O primário requer um número mínimo de membros de dados voting
(ou seja, quórum para a confirmação), incluindo ele próprio, que deve concluir a construção antes de marcar o índice como pronto para uso. Consulte Construções de Índice em Ambientes Replicados para obter mais informações.
Para iniciar uma construção de índice com um quórum para a confirmação não padrão, especifique o commitQuorum.
Use o comando setIndexCommitQuorum
para modificar o quórum para a confirmação de uma compilação de índice em andamento.
Para minimizar o impacto da criação de um índice em conjunto de réplicas e clusters fragmentados, use um procedimento de rolling de índices de construçã, conforme descrito em Construções contínuas de índices em replica sets.
Tipos de agrupamento e índice
Os índices a seguir oferecem suporte apenas à comparação binária simples e não oferecem suporte ao agrupamento:
Dica
Para criar um índice text
ou 2d
em uma collection que tem um agrupamento não simples, você deve especificar explicitamente {collation:
{locale: "simple"} }
ao criar o índice.
Stable API
Ao usar a API estável V1:
Você não pode especificar nenhum dos seguintes campos na array
indexes
:background
bucketSize
sparse
storageEngine
Você não pode criar índices geoHaystack ou texto.
Os tipos de índice não suportados acima são ignorados pelo planejador de query no modo strict. Por exemplo, tentar usar um índice
sparse
comcursor.hint()
resultará no seguinte erroBadValue
:planner returned error :: caused by :: hint provided does not correspond to an existing index
Comportamento
Concurrency
Para featureCompatibilityVersion "4.2"
, createIndexes
usa um processo de compilação otimizado que obtém e mantém um bloqueio exclusivo na coleção especificada no início e no final da compilação de índice. Todas as operações subsequentes na coleção devem aguardar até que createIndexes
libere o bloqueio exclusivo. createIndexes
permite intercalar operações de leitura e gravação durante a maior parte da compilação do índice.
No caso de featureCompatibilityVersion "4.0"
, createIndexes
usa o processo de construção do índice pré-4.2 que, por padrão, obtém um bloqueio exclusivo no banco de dados pai por toda a duração do processo de construção. O processo de compilação pré-4.2 bloqueia todas as operações no banco de dados e todas as suas coleções até que a operação seja concluída. Os índices background
não possuem bloqueio exclusivo.
Para obter mais informações sobre o comportamento de trava de createIndexes
, consulte a página Construções de índices em coleções preenchidas.
Importante
Se um nó de votação com dados se tornar inacessível e o commitQuorum estiver definido como votingMembers
padrão, as compilações de índice poderão ficar suspensas até que o nó volte a ficar on-line.
Limite de uso da memória
O createIndexes
permite criar um ou mais índices em uma coleção. createIndexes
usa uma combinação de memória e arquivos temporários no disco para concluir as compilações de índice. O limite padrão de uso de memória para createIndexes
é de 200 megabytes, compartilhado entre todos os índices criados com um único comando createIndexes
. Após o limite de memória ser atingido, o createIndexes
utiliza arquivos de disco temporários em um subdiretório denominado _tmp
dentro do diretório --dbpath
para concluir a compilação.
Você pode substituir o limite de memória configurando o parâmetro do servidor maxIndexBuildMemoryUsageMegabytes
. A definição de um limite de memória maior pode resultar na conclusão mais rápida das compilações de índices. No entanto, um limite muito alto em relação à RAM não utilizada no seu sistema pode resultar no esgotamento da memória e no desligamento do servidor.
Opções de índice
Non-Hidden Option
A opção oculta pode ser alterada sem que seja necessário descartar e recriar o índice. Consulte Opção oculta.
Alterando opções de índice
As opções de agrupamento em um índice existente podem ser atualizadas. Para alterar outras opções de índice, descarte o índice existente com db.collection.dropIndex()
e, em seguida, execute createIndexes
com as novas opções.
Opção de agrupamento
Você pode criar vários índices na(s) mesma(s) chave(s) com diferentes agrupamentos. Para criar indexes com o mesmo padrão de chave, mas com agrupamentos diferentes, você deve fornecer nomes de índice exclusivos.
Se você especificou um agrupamento no nível da coleção, então:
Se você não especificar um agrupamento ao criar o índice, o MongoDB criará o índice com o agrupamento padrão da coleção.
Se você especificar um agrupamento ao criar o índice, o MongoDB criará o índice com o agrupamento especificado.
Dica
Ao especificar um agrupamento strength
de 1
ou 2
, você pode criar um índice que não diferencia maiúsculas de minúsculas. O índice com um agrupamento strength
de 1
não diferencia letras diacríticas e maiúsculas de minúsculas.
Para usar um índice para comparações de strings, uma operação também deve especificar o mesmo agrupamento. Ou seja, um índice com ordenação não pode suportar uma operação que executa comparações de strings nos campos indexados se a operação especificar uma ordenação diferente.
Aviso
Porque os índices configurados com agrupamento usam ICU. chaves de agrupamento para obter a ordem de classificação, chaves de índice com reconhecimento de agrupamento pode ser maior do que as chaves de índice para índices sem agrupamento.
Por exemplo, a coleta myColl
possui um índice em um campo de sequência category
com o código do idioma de ordenação "fr"
.
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
A seguinte operação de consulta, que especifica o mesmo agrupamento que o índice, pode usar o índice:
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
No entanto, a seguinte operação de consulta, que por padrão usa o agrupador binário "simples", não pode usar o índice:
db.myColl.find( { category: "cafe" } )
Para um índice composto em que as chaves de prefixo do índice não são strings, matrizes e documentos incorporados, uma operação que especifica um agrupamento diferente ainda pode usar o índice para dar suporte a comparações nas chaves de prefixo do índice.
Por exemplo, a coleta myColl
possui um índice composto nos campos numéricos score
e price
e no campo de string category
; o índice é criado com a localidade de ordenação "fr"
para comparações de strings:
db.myColl.createIndex( { score: 1, price: 1, category: 1 }, { collation: { locale: "fr" } } )
As operações a seguir, que usam agrupamento binário "simple"
para comparações de strings, podem usar o índice:
db.myColl.find( { score: 5 } ).sort( { price: 1 } ) db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )
A operação a seguir, que usa agrupamento binário "simple"
para comparações de strings no campo category
indexado, pode usar o índice para preencher apenas a parte score: 5
da query:
db.myColl.find( { score: 5, category: "cafe" } )
Importante
As correspondências com chaves de documentos, incluindo chaves de documentos incorporadas, usam uma comparação binária simples. Isto significa que uma query para uma chave como "foo.bár" não corresponderá à chave "foo.bar", independente do valor definido para o parâmetro de força.
Opção oculta
Para alterar a opção hidden
para índices existentes, você pode utilizar os seguintes métodos do mongosh
:
Por exemplo,
Para alterar a opção
hidden
para um índice paratrue
, utilize o métododb.collection.hideIndex()
:db.restaurants.hideIndex( { borough: 1, ratings: 1 } ); Para alterar a opção
hidden
para um índice parafalse
, utilize o métododb.collection.unhideIndex()
:db.restaurants.unhideIndex( { borough: 1, city: 1 } );
Índices curinga
Os índices curinga omitem o campo
_id
por padrão. Para incluir o campo_id
no índice curinga, você deve explicitamente incluí-lo no documentowildcardProjection
:{ "wildcardProjection" : { "_id" : 1, "<field>" : 0|1 } } Todas as declarações no documento
wildcardProjection
devem ser declarações de inclusão ou de exclusão. Você também pode incluir o campo_id
com declarações de exclusão. Esta é a única exceção à regra.Os índices curinga não suportam:
Os índices curinga são índices esparsos . Eles não oferecem suporte a queries quando um campo indexado não existe. Um índice curinga indexará o documento se o campo curinga tiver um valor
null
.A partir do MongoDB 7.0, os índices curinga suportam ordem crescente (
1
) e decrescente (-1
). As versões anteriores suportavam apenas ordem crescente.
Para saber mais, consulte:
Transações
Você pode criar coleção e indexes dentro de uma transaction distribuída se a transaction não for uma transação de escrita de estilhaço cruzado.
Para usar createIndexes
em uma transação, a transação deve usar preocupação de leitura "local"
. Se você especificar um nível de preocupação de leitura diferente de "local"
, a transação falhará.
Quorum para o Commit Comparado com Write Concern
Há diferenças importantes entre quóruns para a confirmação e preocupações de gravação:
Construções de índice usam quóruns para a confirmação.
As operações de gravação usam preocupações de gravação.
Cada nó portador de dados em um cluster é um membro votante.
O quorum para o commit especifica quantos membros votantes com dados, ou quais membros votantes, incluindo o primário, devem estar preparados para confirmar uma construção de índice simultânea. antes que o primário execute o commit.
A preocupação de gravação é o nível de reconhecimento de que a gravação se propagou para o número especificado de instâncias.
Alterado na versão 8.0: O quorum de confirmação especifica quantos nós devem estar prontos para concluir a criação do índice antes que o primário faça a confirmação da criação do índice. Em contraste, quando o primário tiver confirmado a criação do índice, a preocupação de gravação especifica quantos nós devem replicar a entrada do oplog de criação do índice antes que o comando retorne sucesso.
Em versões anteriores, quando o primário confirmava a criação do índice, a preocupação de gravação especificava quantos nós deveriam finalizar a criação do índice antes que o comando retornasse sucesso.
Exemplo
O seguinte comando constrói dois índices na coleção inventory
do banco de dados products
:
db.getSiblingDB("products").runCommand( { createIndexes: "inventory", indexes: [ { key: { item: 1, manufacturer: 1, model: 1 }, name: "item_manufacturer_model", unique: true }, { key: { item: 1, supplier: 1, model: 1 }, name: "item_supplier_model", unique: true } ], writeConcern: { w: "majority" } } )
Quando a criação de índices for concluída, o MongoDB gera um documento de resultados que inclui um status de "ok" : 1
.
Criar um Índice Curinga
Observação
Para obter a documentação completa sobre índices Curinga, consulte Índices Curinga.
As seguintes listas listam exemplos de criação de índice coringa:
Crie um índice curinga em vários caminhos do campo específicos
Crie um índice curinga que exclua vários caminhos de campo específicos
Criar um Índice Curinga em um Caminho de Campo Único
Considere uma coleção products_catalog
onde os documentos podem conter um campo product_attributes
. O campo product_attributes
pode conter campos aninhados arbitrários, incluindo documentos incorporados e arrays:
db.products_catalog.insertMany( [ { _id : ObjectId("5c1d358bf383fbee028aea0b"), product_name: "Blaster Gauntlet", product_attributes: { price: { cost: 299.99, currency: "USD" } } }, { _id: ObjectId("5c1d358bf383fbee028aea0c"), product_name: "Super Suit", product_attributes: { superFlight: true, resistance: [ "Bludgeoning", "Piercing", "Slashing" ] } } ] )
A seguinte operação cria um índice curinga no campo product_attributes
:
use inventory db.runCommand( { createIndexes: "products_catalog", indexes: [ { key: { "product_attributes.$**" : 1 }, name: "wildcardIndex" } ] } )
Com este índice curinga, MongoDB indexa todos os valores escalares de product_attributes
. Se um campo for um documento ou array aninhado, o índice curinga recorrerá ao documento/array e indexará todos os campos escalares no documento/array.
O índice curinga pode suportar queries arbitrárias de campo único no product_attributes
ou um de seus campos aninhados:
db.products_catalog.find( { "product_attributes.superFlight" : true } ) db.products_catalog.find( { "product_attributes.maxSpeed" : { $gt : 20 } } ) db.products_catalog.find( { "product_attributes.elements" : { $eq: "water" } } )
Observação
A sintaxe do índice curinga específico do caminho é incompatível com a opção wildcardProjection
. Consulte a documentação do parâmetro para mais informações.
Crie um Índice Curinga em Todos os Caminhos de Campo
Considere uma coleção products_catalog
onde os documentos podem conter um campo product_attributes
. O campo product_attributes
pode conter campos aninhados arbitrários, incluindo documentos incorporados e arrays:
db.products_catalog.insertMany( [ { _id : ObjectId("5c1d358bf383fbee028aea0b"), product_name: "Blaster Gauntlet", product_attributes: { price: { cost: 299.99, currency: "USD" } } }, { _id: ObjectId("5c1d358bf383fbee028aea0c"), product_name: "Super Suit", product_attributes: { superFlight: true, resistance: [ "Bludgeoning", "Piercing", "Slashing" ] } } ] )
A seguinte operação cria um índice curinga em todos os campos escalares (excluindo o campo _id
):
use inventory db.runCommand( { createIndexes: "products_catalog", indexes: [ { key: { "$**" : 1 }, name: "wildcardIndex" } ] } )
Com esse índice curinga, o MongoDB indexa todos os campos escalares para cada documento na coleção. Se um determinado campo for um documento ou array aninhada, o índice curinga recorrerá ao documento/array e indexará todos os campos escalares no documento/array.
O índice criado pode suportar queries em qualquer campo arbitrário dentro de documentos na coleção:
db.products_catalog.find( { "product_price" : { $lt : 25 } } ) db.products_catalog.find( { "product_attributes.elements" : { $eq: "water" } } )
Observação
Os índices curinga omitem o campo _id
por padrão. Para incluir o campo _id
no índice curinga, você deve explicitamente incluí-lo no documento wildcardProjection
. Consulte a documentação dos parâmetros para mais informações.
Crie um índice curinga em vários caminhos do campo específicos
Considere uma coleção products_catalog
onde os documentos podem conter um campo product_attributes
. O campo product_attributes
pode conter campos aninhados arbitrários, incluindo documentos incorporados e arrays:
db.products_catalog.insertMany( [ { _id : ObjectId("5c1d358bf383fbee028aea0b"), product_name: "Blaster Gauntlet", product_attributes: { price: { cost: 299.99, currency: "USD" } } }, { _id: ObjectId("5c1d358bf383fbee028aea0c"), product_name: "Super Suit", product_attributes: { superFlight: true, resistance: [ "Bludgeoning", "Piercing", "Slashing" ] } } ] )
A seguinte operação cria um índice curinga e usa a opção wildcardProjection
para incluir somente valores escalares dos campos product_attributes.elements
e product_attributes.resistance
no índice.
use inventory db.runCommand( { createIndexes: "products_catalog", indexes: [ { key: { "$**" : 1 }, "wildcardProjection" : { "product_attributes.elements" : 1, "product_attributes.resistance" : 1 }, name: "wildcardIndex" } ] } )
Enquanto o padrão de chave "$**"
abrange todos os campos do documento, o campo wildcardProjection
limita o índice apenas aos campos incluídos e seus campos aninhados.
Se um campo for um documento ou array aninhado, o índice curinga recorrerá ao documento/array e indexará todos os campos escalares no documento/array.
O índice criado pode suportar queries em qualquer campo escalar incluído no wildcardProjection
:
db.products_catalog.find( { "product_attributes.elements" : { $eq: "Water" } } ) db.products_catalog.find( { "product_attributes.resistance" : "Bludgeoning" } )
Observação
Os índices curinga não suportam a combinação de instruções de inclusão e exclusão no documento wildcardProjection
, exceto quando se inclui explicitamente o campo _id
. Para obter mais informações sobre wildcardProjection
, consulte a documentação do parâmetro.
Crie um índice curinga que exclua vários caminhos de campo específicos
Considere uma coleção products_catalog
onde os documentos podem conter um campo product_attributes
. O campo product_attributes
pode conter campos aninhados arbitrários, incluindo documentos incorporados e arrays:
db.products_catalog.insertMany( [ { _id : ObjectId("5c1d358bf383fbee028aea0b"), product_name: "Blaster Gauntlet", product_attributes: { price: { cost: 299.99, currency: "USD" } } }, { _id: ObjectId("5c1d358bf383fbee028aea0c"), product_name: "Super Suit", product_attributes: { superFlight: true, resistance: [ "Bludgeoning", "Piercing", "Slashing" ] } } ] )
A seguinte operação cria um índice curinga e utiliza o documento wildcardProjection
para indexar todos os campos escalares para cada documento na coleção, excluindo os campos product_attributes.elements
e product_attributes.resistance
:
use inventory db.runCommand( { createIndexes: "products_catalog", indexes: [ { key: { "$**" : 1 }, "wildcardProjection" : { "product_attributes.elements" : 0, "product_attributes.resistance" : 0 }, name: "wildcardIndex" } ] } )
Enquanto o padrão de chave "$**"
abrange todos os campos no documento, o campo wildcardProjection
exclui os campos especificados do índice.
Se um campo for um documento ou array aninhado, o índice curinga recorrerá ao documento/array e indexará todos os campos escalares no documento/array.
O índice criado pode suportar queries em qualquer campo escalar exceto aquelas excluídas por wildcardProjection
:
db.products_catalog.find( { "product_attributes.maxSpeed" : { $gt: 25 } } ) db.products_catalog.find( { "product_attributes.superStrength" : true } )
Observação
Os índices curinga não suportam a combinação de instruções de inclusão e exclusão no documento wildcardProjection
, exceto quando se inclui explicitamente o campo _id
. Para obter mais informações sobre wildcardProjection
, consulte a documentação do parâmetro.
Criar Índice com Commit Quorum
Observação
Exige featureCompatibilityVersion 4.4+
Cada mongod
no conjunto de réplica ou agrupamento fragmentado deve ter featureCompatibilityVersion configurado para pelo menos 4.4
para iniciar construções de índice simultaneamente entre membros do conjunto de réplicas.
Construir índices em um conjunto de réplicas ou cluster particionado é feito simultaneamente em todos os membros do conjunto de réplicas que contêm dados. Para clusters fragmentados, a construção de índices ocorre somente em fragmentos que contêm dados para a coleção que está sendo indexada. O primário requer um número mínimo de membros de dados voting
(ou seja, quórum para a confirmação), incluindo ele próprio, que deve concluir a construção antes de marcar o índice como pronto para uso. Consulte Construções de Índice em Ambientes Replicados para obter mais informações.
Para definir o quórum para a confirmação, use createIndexes
para especificar o valor commitQuorum
.
commitQuorum
especifica quantos nós votantes portadores de dados, ou quais nós votantes, incluindo o primário, devem estar preparados para confirmar a construção do índice antes que o primário execute o commit. O commit quorum padrão é votingMembers
, o que significa todos os nós portadores de dados.
A seguinte operação cria um índice com um quórum para a confirmação de "majority"
, ou uma simples maioria dos nós com recurso de dados:
db.getSiblingDB("examples").runCommand( { createIndexes: "invoices", indexes: [ { key: { "invoices" : 1 }, "name" : "invoiceIndex" } ], "commitQuorum" : "majority" } )
A construção do índice de notas primário ficou pronta somente após a maioria simples dos membros votantes portadores de dados " votarem em" para confirmar a criação do índice. Para obter mais informações sobre a criação de índices e o processo de votação, consulte Construções de índices em ambientes replicados.
Saída
O comando createIndexes
retorna um documento que indica o sucesso da operação. O documento contém alguns, mas não todos os seguintes campos, dependendo do resultado:
createIndexes.createdCollectionAutomatically
Se
true
, a collection não existiu e foi criada no processo de criação do índice.