A unique index rejects any write that would create a duplicate value for the indexed field(s). MongoDB enforces this constraint at the storage layer — no application-level duplicate check is needed.
// Single field unique index db.users.createIndex({ email: 1 }, { unique: true, name: "idx_email_unique" }) // Compound unique index — the COMBINATION must be unique // (userId, date) can repeat userId, repeat date — but not the same (userId, date) pair db.checkins.createIndex( { userId: 1, date: 1 }, { unique: true, name: "idx_user_date_unique" } ) // Duplicate insert → WriteError E11000 // E11000 duplicate key error collection: mydb.users index: idx_email_unique // dup key: { : "user@example.com" }
Null and Missing Fields with Unique Indexes
null as their index key — which violates uniqueness. You can only have one document with a missing/null value in a standard unique index. Use unique + sparse or unique + partial to allow multiple documents with missing values.// Standard unique index on email — only ONE null allowed db.users.createIndex({ email: 1 }, { unique: true }) db.users.insertOne({ name: "Alice" }) // ✅ no email — null db.users.insertOne({ name: "Bob" }) // ❌ E11000 — second null // Fix: unique + sparse — excludes missing/null docs from index entirely db.users.createIndex({ email: 1 }, { unique: true, sparse: true }) db.users.insertOne({ name: "Alice" }) // ✅ excluded from index db.users.insertOne({ name: "Bob" }) // ✅ excluded from index db.users.insertOne({ name: "Carol", email: "c@x.com" }) // ✅ in index, unique db.users.insertOne({ name: "Dave", email: "c@x.com" }) // ❌ E11000
Unique Index Edge Cases
| Scenario | Behavior |
|---|---|
| Inserting duplicate value | WriteError E11000 |
| Creating unique index on existing collection with duplicates | Index creation fails — must resolve duplicates first |
| Two documents with missing field (standard unique) | Second insert fails — both have null key |
| Unique + sparse with missing field | Multiple missing-field docs allowed — excluded from index |
| Case sensitivity | "User@example.com" ≠ "user@example.com" — unique treats them as distinct |
| Sharded collection unique index | Unique only if shard key is a prefix of the unique index key |