Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Convertir un índice existente en un índice único

Para convertir un índice no único a un índice único, usa 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

Ejecuta collMod en el índice de campo type y establece 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 el índice puede ser convertido, vuelve 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, ejecuta el comando collMod con unique: true y remueve el indicador dryRun:

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

Volver

Único compuesto

En esta página