Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

Converter um Índice Existente em um Índice Único

Nesta página

  • Antes de começar
  • Passos
  • Saiba mais

Para converter um índice não í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.

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")
]
}
]
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 }

Voltar

Unique