Mongodb Primary Key: ตัวอย่างการตั้งค่าฟิลด์ _id ด้วย ObjectId()
⚡ สรุปอย่างชาญฉลาด
MongoDB คีย์หลักคือฟิลด์ _id ที่ใช้ระบุเอกสารแต่ละฉบับในคอลเลกชันได้อย่างไม่ซ้ำกัน โดยค่าเริ่มต้น ฟิลด์นี้จะเก็บค่า ObjectId ที่สร้างขึ้นโดยอัตโนมัติ แต่คุณสามารถกำหนดค่าของคุณเองให้กับฟิลด์ _id ได้เมื่อแทรกเอกสาร

คีย์หลักคืออะไร MongoDB?
In MongoDBฟิลด์ _id เป็นคีย์หลักสำหรับคอลเลกชัน เพื่อให้สามารถระบุแต่ละเอกสารในคอลเลกชันได้โดยไม่ซ้ำกัน ฟิลด์ _id มีค่า ObjectID ที่ไม่ซ้ำกัน
ตามค่าเริ่มต้นเมื่อแทรกเอกสารในคอลเลกชัน หากคุณไม่เพิ่มชื่อฟิลด์ด้วย _id ในชื่อฟิลด์ MongoDB จะเพิ่มฟิลด์รหัสวัตถุโดยอัตโนมัติตามที่แสดงด้านล่าง
เมื่อคุณสอบถามเอกสารในคอลเลกชัน คุณสามารถดู ObjectId สำหรับแต่ละเอกสารในคอลเลกชันได้
หากท่านต้องการความมั่นใจว่า MongoDB จะไม่สร้างฟิลด์ _id เมื่อสร้างคอลเลกชัน และหากคุณต้องการระบุ ID ของคุณเองเป็น _id ของคอลเลกชัน คุณจะต้องกำหนดสิ่งนี้อย่างชัดเจนในขณะที่สร้างคอลเลกชัน
เมื่อสร้างช่องรหัสอย่างชัดเจน จะต้องสร้างช่องด้วย _id ในชื่อ
ลองดูตัวอย่างว่าเราจะบรรลุเป้าหมายนี้ได้อย่างไร
db.Employee.insert({_id:10, "EmployeeName" : "Smith"})
Code คำอธิบาย:
- เรากำลังสมมติว่าเรากำลังสร้างเอกสารแรกในคอลเลกชัน และด้วยเหตุนี้ในคำสั่งข้างต้นในขณะที่สร้างคอลเลกชัน เราจะกำหนดฟิลด์ _id อย่างชัดเจนและกำหนดค่าให้กับมัน
หากดำเนินการคำสั่งสำเร็จแล้วและตอนนี้ใช้คำสั่งค้นหาเพื่อแสดงเอกสารในคอลเล็กชั่น จะแสดงผลลัพธ์ต่อไปนี้
Output:
ผลลัพธ์แสดงให้เห็นอย่างชัดเจนว่าฟิลด์ _id ที่เรากำหนดไว้ในขณะที่สร้างคอลเลกชันนั้นถูกใช้เป็นคีย์หลักสำหรับคอลเลกชันแล้ว
ObjectId คืออะไรใน MongoDB?
ObjectId คือประเภทค่าเริ่มต้นที่ MongoDB กำหนดค่าให้กับคีย์หลัก _id ซึ่งเป็นตัวระบุขนาด 12 ไบต์ที่ออกแบบมาให้มีค่าที่ไม่ซ้ำกันทั่วโลกในเซิร์ฟเวอร์และคอลเลกชันต่างๆ ดังนั้นเอกสารสองฉบับจึงแทบจะไม่ได้รับค่าเดียวกัน เนื่องจากไดรเวอร์ไคลเอ็นต์สามารถสร้าง ObjectId ได้โดยไม่ต้องขอจากเซิร์ฟเวอร์ MongoDB สามารถแทรกเอกสารได้อย่างรวดเร็วและใช้งานได้กับเครื่องหลายเครื่องโดยไม่ต้องมีตัวนับส่วนกลาง
ObjectId แต่ละตัวจะถูกจัดเก็บในรูปแบบไบนารีที่กะทัดรัด แต่จะแสดงผลเป็นสตริงเลขฐานสิบหก 24 ตัวอักษร ตัวอย่างเช่น ObjectId(“507f1f77bcf86cd799439011”) ไบต์แรกๆ จะอิงตามเวลาปัจจุบัน ซึ่งหมายความว่าค่าจะเพิ่มขึ้นเรื่อยๆ เมื่อมีการสร้างเอกสารใหม่ คุณสมบัตินี้ทำให้ ObjectId ไม่เพียงแต่มีเอกลักษณ์เฉพาะตัว แต่ยังสามารถเรียงลำดับได้คร่าวๆ ตามลำดับการแทรก ซึ่งเป็นคุณสมบัติที่มีประโยชน์เมื่อคุณต้องการแสดงบันทึกที่ใหม่ที่สุดหรือเก่าที่สุดก่อน
โครงสร้างของ MongoDB รหัสวัตถุ
A MongoDB ObjectId มีความยาว 12 ไบต์ และแต่ละส่วนมีความหมายเฉพาะเจาะจง การทำความเข้าใจโครงสร้างนี้จะช่วยอธิบายว่าทำไม ObjectId จึงมีเอกลักษณ์และเรียงลำดับตามเวลา:
- การประทับเวลา 4 ไบต์: จำนวนวินาทีตั้งแต่ยุค Unix epoch ซึ่งบันทึกเวลาที่สร้าง ObjectId ทำให้สามารถเรียงลำดับ ID ตามเวลาได้
- ค่าสุ่ม 5 ไบต์: ค่านี้จะถูกสร้างขึ้นเพียงครั้งเดียวต่อกระบวนการ โดยเป็นการรวมรหัสประจำตัวของเครื่องจักรและกระบวนการเข้าด้วยกัน ดังนั้นไคลเอนต์ที่แตกต่างกันจึงสร้างรหัสประจำตัวที่แตกต่างกัน
- ตัวนับเพิ่มค่า 3 ไบต์: ตัวนับที่เริ่มต้นจากค่าสุ่มและเพิ่มขึ้นทุกครั้งที่มี ObjectId ใหม่เข้ามาในวินาทีเดียวกัน เพื่อป้องกันการชนกันระหว่างการแทรกข้อมูลอย่างรวดเร็ว
ส่วนประกอบทั้งสามนี้ร่วมกันรับประกันว่า ObjectId ทุกตัวจะมีเอกลักษณ์เฉพาะตัว แม้ว่าจะมีเอกสารจำนวนมากถูกแทรกเข้ามาพร้อมกันในเซิร์ฟเวอร์ต่างๆ ก็ตาม คุณสามารถอ่านเวลาสร้างที่ฝังอยู่ภายในได้ตลอดเวลาโดยการเรียกใช้เมธอด getTimestamp() บน ObjectId
ข้อดีของการใช้ ObjectId เป็นคีย์หลัก
การใช้ ObjectId เริ่มต้นเป็นคีย์หลัก _id มีข้อดีในทางปฏิบัติหลายประการ ซึ่งเป็นเหตุผลว่าทำไมส่วนใหญ่จึงใช้ MongoDB คอลเลกชันต่างๆ อาศัยสิ่งนี้:
- การสร้างอัตโนมัติ: คุณไม่จำเป็นต้องสร้างหรือจัดการค่าคีย์ด้วยตนเอง ซึ่งช่วยลดโอกาสที่จะเกิดคีย์ซ้ำ
- ความเป็นเอกลักษณ์ระดับโลก: ObjectIds จะไม่ซ้ำกันในทุกเซิร์ฟเวอร์ ดังนั้นจึงใช้งานได้ดีในการใช้งานแบบกระจายและแบบแบ่งส่วน
- มีการประทับเวลาในตัว: เวลาสร้างเอกสารที่ฝังอยู่ในระบบ ช่วยให้คุณสามารถจัดเรียงหรือกรองเอกสารตามอายุได้โดยไม่ต้องเพิ่มช่องวันที่เพิ่มเติม
- ประสิทธิภาพสูง: การสร้างข้อมูลฝั่งไคลเอ็นต์ช่วยหลีกเลี่ยงการส่งข้อมูลไปกลับไปยังเซิร์ฟเวอร์ ทำให้...ping ใส่ได้เร็ว
แม้ว่า ObjectId จะเหมาะกับแอปพลิเคชันส่วนใหญ่ แต่คุณก็ยังสามารถเลือกใช้ _id แบบกำหนดเองได้ เช่น ที่อยู่อีเมลหรือรหัสสินค้า เมื่อคีย์ทางธุรกิจที่เป็นธรรมชาติทำให้การค้นหาง่ายขึ้น การเลือกที่เหมาะสมขึ้นอยู่กับว่าคุณวางแผนที่จะค้นหาและเชื่อมโยงข้อมูลของคุณอย่างไร


