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" }