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.
Acerca de esta tarea
El comando collMod convierte el índice existente. MongoDB escanea el índice en busca de claves duplicadas y luego marca el índice como único.
Tenga en cuenta el siguiente comportamiento al convertir un índice:
Establezca
prepareUniqueentrueantes de convertir el índice. SiprepareUniqueesfalse,collModconunique: truedevuelve un error.Ejecute la modificación
prepareUniqueen un comandocollModseparado. No puede combinarprepareUniquecon otras modificaciones de índice.No se puede establecer
prepareUniqueen un índice de una colección de series temporales. MongoDB devuelve un error.Si otra operación modifica o elimina el índice mientras
collModlo convierte, el comando fallará. Vuelva a ejecutar el comando una vez que la otra operación haya finalizado.
Para las colecciones fragmentadas, también se aplica el siguiente comportamiento:
Si alguna partición contiene claves duplicadas,
collModdevuelveCannotConvertIndexToUnique. MongoDB no convierte el índice en ninguna partición.Si la clave del índice entra en conflicto con la clave del fragmento, la configuración de
prepareUniquefalla. Para saber qué índices pueden ser únicos en una colección fragmentada, consulte Clústeres fragmentados e índices únicos.
Antes de comenzar
Pasos
Preparar el índice para que se convierta en un índice único
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" }Verifique las infracciones de claves únicas
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 documentswere 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.