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.
Sobre esta tarefa
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
prepareUniquecomotrueantes de converter o índice. SeprepareUniqueforfalse,collModcomunique: trueretornará um erro.Execute a modificação
prepareUniqueem um comandocollModseparado. Você não pode combinarprepareUniquecom outras modificações de índice.Não é possível definir
prepareUniqueem 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
collModo 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,
collModretornará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
prepareUniquefalhará. Para saber quais índices podem ser exclusivos em uma coleção fragmentada, consulte Clusters fragmentados e índices exclusivos.
Antes de começar
Passos
Prepare o índice para ser convertido em um índice único
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" }Verifique se há violações de chave única
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.