Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

MongoDB Transaction และ Index ป้องกันค่าซ้ำใน Array

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