MongoDB - ลำดับการเพิ่มอัตโนมัติ

MongoDB ไม่มีฟังก์ชันการเพิ่มอัตโนมัติแบบสำเร็จรูปเช่นฐานข้อมูล SQL โดยค่าเริ่มต้นจะใช้ ObjectId ขนาด 12 ไบต์สำหรับไฟล์_idฟิลด์เป็นคีย์หลักเพื่อระบุเอกสารโดยไม่ซ้ำกัน อย่างไรก็ตามอาจมีสถานการณ์ที่เราอาจต้องการให้ฟิลด์ _id มีค่าที่เพิ่มขึ้นโดยอัตโนมัตินอกเหนือจาก ObjectId

เนื่องจากนี่ไม่ใช่คุณสมบัติเริ่มต้นใน MongoDB เราจะบรรลุฟังก์ชันนี้โดยใช้โปรแกรมโดยใช้ไฟล์ counters คอลเลกชันตามที่แนะนำโดยเอกสาร MongoDB

ใช้ Counter Collection

พิจารณาสิ่งต่อไปนี้ productsเอกสาร. เราต้องการให้ฟิลด์ _id เป็นไฟล์auto-incremented integer sequence เริ่มตั้งแต่ 1,2,3,4 ถึง n.

{
  "_id":1,
  "product_name": "Apple iPhone",
  "category": "mobiles"
}

สำหรับสิ่งนี้ให้สร้างไฟล์ counters คอลเลกชันซึ่งจะติดตามค่าลำดับสุดท้ายสำหรับฟิลด์ลำดับทั้งหมด

>db.createCollection("counters")

ตอนนี้เราจะแทรกเอกสารต่อไปนี้ในคอลเลกชันตัวนับด้วย productid เป็นกุญแจสำคัญ -

> db.counters.insert({
	"_id":"productid",
	"sequence_value": 0
})
WriteResult({ "nInserted" : 1 })
>

สนาม sequence_value ติดตามค่าสุดท้ายของลำดับ

ใช้รหัสต่อไปนี้เพื่อแทรกเอกสารลำดับนี้ในคอลเลกชันตัวนับ -

>db.counters.insert({_id:"productid",sequence_value:0})

การสร้างฟังก์ชัน Javascript

ตอนนี้เราจะสร้างฟังก์ชัน getNextSequenceValueซึ่งจะใช้ชื่อลำดับเป็นอินพุตเพิ่มหมายเลขลำดับทีละ 1 และส่งคืนหมายเลขลำดับที่อัปเดต ในกรณีของเราชื่อลำดับคือproductid.

>function getNextSequenceValue(sequenceName){
   var sequenceDocument = db.counters.findAndModify({
      query:{_id: sequenceName },
      update: {$inc:{sequence_value:1}},
      new:true
   });
   return sequenceDocument.sequence_value;
}

การใช้ฟังก์ชัน Javascript

ตอนนี้เราจะใช้ฟังก์ชัน getNextSequenceValue ในขณะที่สร้างเอกสารใหม่และกำหนดค่าลำดับที่ส่งคืนเป็นฟิลด์ _id ของเอกสาร

แทรกเอกสารตัวอย่างสองชุดโดยใช้รหัสต่อไปนี้ -

>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Apple iPhone",
   "category":"mobiles"
})
>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Samsung S3",
   "category":"mobiles"
})

อย่างที่คุณเห็นเราได้ใช้ฟังก์ชัน getNextSequenceValue เพื่อกำหนดค่าสำหรับฟิลด์ _id

ในการตรวจสอบการทำงานให้เราดึงเอกสารโดยใช้คำสั่ง find -

>db.products.find()

ข้อความค้นหาข้างต้นส่งคืนเอกสารต่อไปนี้ที่มีฟิลด์ _id ที่เพิ่มขึ้นอัตโนมัติ -

{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}
{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }