Để tạo unique index (chỉ mục duy nhất) trên trường, đặt unique: true khi tạo index. Kết hợp sparse: true để bỏ qua tài liệu không có trường đó. Tạo collection:
> db.demo658.createIndex({FirstName:1},{unique:true,sparse:true});
{ "createdCollectionAutomatically" : true, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
> db.demo658.insertOne({"FirstName":"John","LastName":"Smith"});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea067144deddd72997713d9") }
> db.demo658.insertOne({"FirstName":"Adam","LastName":"Smith"});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea0671c4deddd72997713da") }
> db.demo658.insertOne({"FirstName":"John","LastName":"Doe"});
2020-04-22T21:17:46.072+0530 E QUERY [js] WriteError: E11000 duplicate key error collection: onlinecustomertracker.demo658 index: FirstName_1 dup key: { : "John" }
: WriteError({ "index" : 0, "code" : 11000, "errmsg" : "E11000 duplicate key error collection: onlinecustomertracker.demo658 index: FirstName_1 dup key: { : \"John\" }", "op" : { "_id" : ObjectId("5ea067224deddd72997713db"), "FirstName" : "John", "LastName" : "Doe" } })
WriteError@src/mongo/shell/bulk_api.js:461:48
Bulk/mergeBatchResults@src/mongo/shell/bulk_api.js:841:49
Bulk/executeBatch@src/mongo/shell/bulk_api.js:906:13
Bulk/this.execute@src/mongo/shell/bulk_api.js:1150:21
DBCollection.prototype.insertOne@src/mongo/shell/crud_api.js:252:9
@(shell):1:1
Lỗi E11000 duplicate key - không cho phép FirstName trùng "John". Hiển thị dữ liệu hiện có:
> db.demo658.find();
Kết quả (chỉ 2 tài liệu, John Doe bị từ chối):
Giải thích tham số:
unique: true- giá trị trường phải duy nhất, insert/update trùng sẽ báo lỗi E11000sparse: true- chỉ index tài liệu CÓ trường FirstName, bỏ qua tài liệu thiếu trường (không coi null là trùng lặp)
Lưu ý: Unique index trên _id được tạo tự động. Không thể tạo unique index nếu collection đã có dữ liệu trùng. Dùng dropDups: true (deprecated) hoặc xóa trùng thủ công trước khi tạo index.