Docs Menu
Docs Home
/ /
Unique Indexes

Convertir un índice existente en un índice único

Para convertir un índice no único en un índice único, utilice el collModComando. El collMod comando proporciona opciones para verificar que el campo indexado contenga valores únicos antes de completar la conversión.

1

Crear la colección 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

Agregue un índice de campo único en el campo type:

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

Ejecute collMod en el índice del campo type y establezca prepareUnique en true:

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

Después de configurar prepareUnique, no se pueden insertar nuevos documentos que dupliquen una entrada de clave de índice. Por ejemplo, la siguiente operación de inserción genera un error:

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 si hay documentos que violen la restricción única en el campo type, ejecute collMod con unique: true y 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 completar la conversión, modifica las entradas duplicadas para remover cualquier conflicto. Por ejemplo:

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

Para confirmar que se puede convertir el índice, vuelva a ejecutar el comando collMod() con dryRun: true:

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

Para finalizar la conversión a un índice único, ejecute el comando collMod con unique: true y elimine el indicador dryRun:

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

Volver

Unique Indexes

En esta página