Để ngăn chặn giá trị trùng lặp trong mảng trên các tài liệu khác nhau, tạo unique index trên trường mảng. MongoDB sẽ "multikey index" – lập index cho từng phần tử trong mảng. Nếu bất kỳ phần tử nào trùng khớp giá trị đã có trong index, ghi sẽ bị từ chối.
Tạo index duy nhất trên trường Marks
> db.demo298.save({Name: 'Chris', Marks: [46, 79] });
WriteResult({ "nInserted" : 1 })
> db.demo298.save({Name: 'David', Marks: [67, 88] });
WriteResult({ "nInserted" : 1 })
> db.demo298.ensureIndex({ Marks: 1 }, {unique: 1});
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Thử chèn tài liệu có Marks trùng 88
> db.demo298.save({Name: 'Mike', Marks: [88,98] });
WriteResult({ "nInserted" : 0, "writeError" : { "code" : 11000, "errmsg" : "E11000 duplicate key error collection: test.demo298 index: Marks_1 dup key: { : 88.0 }" } })
Dữ liệu hiện có
> db.demo298.find();
{ "_id" : ObjectId("5e4d56e55d93261e4bc9ea48"), "Name" : "Chris", "Marks" : [ 46, 79 ] }
{ "_id" : ObjectId("5e4d56f55d93261e4bc9ea49"), "Name" : "David", "Marks" : [ 67, 88 ] }
Lưu ý quan trọng:
- Unique index trên mảng áp dụng cho từng phần tử – không thể có cùng giá trị xuất hiện trong mảng của hai tài liệu khác nhau.
- Trong cùng một mảng, giá trị trùng lặp được phép (ví dụ
[88, 88]), trừ khi dùngunique: truekết hợp vớipartialFilterExpression(phức tạp). ensureIndexlà alias cũ, hiện nay dùngcreateIndex.- Khái niệm "Transaction" trong tiêu đề gốc không chính xác – ví dụ này demo unique index, không phải transaction ACID.