Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.

Converter um Índice Existente em um Índice Único

Para converter um índice não índice único em um índice único, use o comando collMod . O comando collMod fornece opções para verificar se seu campo indexado contém valores exclusivos antes de concluir a conversão.

O comando collMod converte o índice existente. O MongoDB verifica o índice em busca de chaves duplicadas e depois marca o índice como exclusivo.

Tenha em mente o seguinte comportamento ao converter um índice:

  • Defina prepareUnique como true antes de converter o índice. Se prepareUnique for false, collMod com unique: true retornará um erro.

  • Execute a modificação prepareUnique em um comando collMod separado. Você não pode combinar prepareUnique com outras modificações de índice.

  • Não é possível definir prepareUnique em um índice em uma coleção de séries temporais. O MongoDB retorna um erro.

  • Se outra operação modificar ou descartar o índice enquanto collMod o converte, o comando falhará. Execute novamente o comando após a conclusão da outra operação.

Para collections fragmentadas, o seguinte comportamento também se aplica:

  • Se algum shard contiver chaves duplicadas, collMod retornará CannotConvertIndexToUnique. O MongoDB não converte o índice em nenhum shard.

  • Se a chave do índice entrar em conflito com a chave do shard, a configuração prepareUnique falhará. Para saber quais índices podem ser exclusivos em uma coleção fragmentada, consulte Clusters fragmentados e índices exclusivos.

1

Crie a coleção apples:

db.apples.insertMany( [ { type: "Delicious", quantity: 12 }, { type: "Macintosh", quantity: 13 }, { type: "Delicious", quantity: 13 }, { type: "Fuji", quantity: 15 }, { type: "Washington", quantity: 10 }] )
2

Adicione um único índice de campo no campo type:

db.apples.createIndex( { type: 1 } )
1

Execute collMod no índice do campo type e configure prepareUnique para true:

db.runCommand( { collMod: "apples", index: { keyPattern: { type: 1 }, prepareUnique: true }} )

Depois que prepareUnique for definido, você não poderá inserir novos documentos que duplicam uma entrada de chave de índice. Por exemplo, a seguinte operação de inserção resulta em um erro:

db.apples.insertOne( { type: "Delicious", quantity: 20 } )
MongoServerError: E11000 duplicate key error collection:test.apples index: type_1 dup key: { type: "Delicious" }
2

Para ver se há algum documento que viola a restrição exclusiva no campo type , execute collMod com unique: true e dryRun: true:

db.runCommand( { collMod: "apples", index: { keyPattern: { type: 1 }, unique: true }, dryRun: true} )
MongoServerError: Cannot convert the index to unique. Please resolve conflicting documents before running collMod again. Violations: [ { ids: [ ObjectId("660489d24cabd75abebadbd0"), ObjectId("660489d24cabd75abebadbd2") ] }]

Observação

Se a resposta contendo todos os valores de documento conflitantes _id exceder 8MB, o MongoDB retornará a seguinte mensagem de erro em vez de listar as violações específicas:

Cannot convert the index to unique. Too many conflicting documentswere detected. Please resolve them and rerun collMod.

Nesse caso, resolva as entradas duplicadas até que a resposta esteja abaixo de 8MB e, em seguida, execute collMod novamente para ver as violações restantes.

3

Para concluir a conversão, modifique as entradas duplicadas para remover quaisquer conflitos. Por exemplo:

db.apples.deleteOne( { _id: ObjectId("660489d24cabd75abebadbd2") })
4

Para confirmar que o índice pode ser convertido, execute novamente o comando collMod() com dryRun: true:

db.runCommand( { collMod: "apples", index: { keyPattern: { type: 1 }, unique: true }, dryRun: true} )
{ ok: 1 }
5

Para finalizar a conversão para um índice único, execute o comando collMod com unique: true e remova o sinalizador dryRun :

db.runCommand( { collMod: "apples", index: { keyPattern: { type: 1 }, unique: true }} )
{ unique_new: true, ok: 1 }