For AI agents: a documentation index is available at https://www.mongodb.com/docs/llms.txt — markdown versions of all pages are available by appending .md to any URL path.
Docs Menu

Convert an Existing Index to a Unique Index

To convert a non-unique index to a unique index, use the collMod command. The collMod command provides options to verify that your indexed field contains unique values before you complete the conversion.

1

Create the apples collection:

db.apples.insertMany( [
{ type: "Delicious", quantity: 12 },
{ type: "Macintosh", quantity: 13 },
{ type: "Delicious", quantity: 13 },
{ type: "Fuji", quantity: 15 },
{ type: "Washington", quantity: 10 }
] )
2

Add a single field index on the type field:

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

Run collMod on the type field index and set prepareUnique to true:

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

After prepareUnique is set, you cannot insert new documents that duplicate an index key entry. For example, the following insert operation results in an error:

db.apples.insertOne( { type: "Delicious", quantity: 20 } )
MongoServerError: E11000 duplicate key error collection:
test.apples index: type_1 dup key: { type: "Delicious" }
2

To see if there are any documents that violate the unique constraint on the type field, run collMod with unique: true and 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")
]
}
]

Note

If the response containing all conflicting document _id values exceeds 8MB, MongoDB returns the following error message instead of listing the specific violations:

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

In this case, resolve duplicate entries until the response is under 8MB, then run collMod again to see the remaining violations.

3

To complete the conversion, modify the duplicate entries to remove any conflicts. For example:

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

To confirm that the index can be converted, re-run the collMod() command with dryRun: true:

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

To finalize the conversion to a unique index, run the collMod command with unique: true and remove the dryRun flag:

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