Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

Convertir un índice existente en un índice único

Para convertir un índice no único en un índice único, utiliza el comando collMod. El comando collMod proporciona opciones para verificar que su 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 establecer prepareUnique, no puedes insertar nuevos documentos que dupliquen una entrada de clave de índice. Por ejemplo, la siguiente operación de inserción da como resultado 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 algún documento que infrinja la restricción de exclusividad en el campo type, ejecuta 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")
]
}
]

Nota

Si la respuesta que contiene todos los valores de documento en conflicto _id supera los 8MB, MongoDB devuelve el siguiente mensaje de error en lugar de enumerar las infracciones específicas:

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

En este caso, resuelva las entradas duplicadas hasta que la respuesta sea inferior a 8MB, luego ejecute collMod de nuevo para ver las infracciones restantes.

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 }