MongoDB สามารถสร้าง Unique Index บน Field ที่เป็น Array ได้ โดยจะ Enforce Uniqueness ต่อ Element ใน Array (ไม่ใช่ต่อ Array ทั้งหมด) เนื้อหานี้สาธิตการใช้ ensureIndex() กับ unique: true บน Field Marks ที่เป็น Array
ตัวอย่างข้อมูลทดสอบ
> 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
}
ทดสอบ Insert ค่าซ้ำ
> 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 }"
}
})
ข้อมูลที่เหลืออยู่
> db.demo298.find();
{
"_id" : ObjectId("5e4d56e55d93261e4bc9ea48"),
"Name" : "Chris",
"Marks" : [ 46, 79 ]
}
{
"_id" : ObjectId("5e4d56f55d93261e4bc9ea49"),
"Name" : "David",
"Marks" : [ 67, 88 ]
}
คำอธิบายสำคัญ
- Unique Index บน Array: MongoDB จะ Index ทุก Element ใน Array แยกกัน
- Insert
[88,98]ล้มเหลวเพราะ 88 มีอยู่แล้วใน David's Marks [67, 88] - Error Code 11000 = Duplicate Key Error
ensureIndex()เป็น Legacy Syntax ปัจจุบันใช้createIndex()แทน- Transaction: บทความกล่าวถึง Transaction แต่ตัวอย่างไม่ได้ใช้ Transaction จริง (Unique Index ทำงานได้โดยไม่ต้องการ Transaction)
- สำหรับ Unique Constraint ภายใน Array เดียว (No duplicates within same array) ต้องใช้
partialFilterExpressionหรือ Application Level Check