Mongodb Primary Key: ตัวอย่างการตั้งค่าฟิลด์ _id ด้วย ObjectId()

⚡ สรุปอย่างชาญฉลาด

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

  • 🔑 บทบาทหลักสำคัญ: ฟิลด์ _id เป็นคีย์หลักที่ใช้ระบุเอกสารแต่ละฉบับในอาร์เรย์ได้อย่างไม่ซ้ำกัน MongoDB การเก็บ
  • 🆔 ObjectId เริ่มต้น: ถ้าคุณละเว้น _id, MongoDB ระบบจะเพิ่มค่า ObjectId ที่ไม่ซ้ำกันขนาด 12 ไบต์ลงในเอกสารโดยอัตโนมัติ
  • ⏱️ เรียงตามลำดับเวลา: ObjectId เริ่มต้นด้วยการประทับเวลา 4 ไบต์ ดังนั้น ID จึงสามารถเรียงลำดับได้คร่าวๆ ตามเวลาที่สร้าง
  • 🇧🇷 ปุ่มกำหนดเอง: คุณสามารถระบุค่า _id ของคุณเองได้ เช่น ตัวเลขหรือสตริง เมื่อแทรกเอกสาร
  • 🔒 ไม่เปลี่ยนรูป: เมื่อตั้งค่า _id แล้ว จะไม่สามารถเปลี่ยนแปลงได้ คุณต้องลบและแทรกใหม่เพื่อแก้ไข

คีย์หลักคืออะไร MongoDB?

In MongoDBฟิลด์ _id เป็นคีย์หลักสำหรับคอลเลกชัน เพื่อให้สามารถระบุแต่ละเอกสารในคอลเลกชันได้โดยไม่ซ้ำกัน ฟิลด์ _id มีค่า ObjectID ที่ไม่ซ้ำกัน

ตามค่าเริ่มต้นเมื่อแทรกเอกสารในคอลเลกชัน หากคุณไม่เพิ่มชื่อฟิลด์ด้วย _id ในชื่อฟิลด์ MongoDB จะเพิ่มฟิลด์รหัสวัตถุโดยอัตโนมัติตามที่แสดงด้านล่าง

คีย์หลักเข้า MongoDB

เมื่อคุณสอบถามเอกสารในคอลเลกชัน คุณสามารถดู ObjectId สำหรับแต่ละเอกสารในคอลเลกชันได้

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

เมื่อสร้างช่องรหัสอย่างชัดเจน จะต้องสร้างช่องด้วย _id ในชื่อ

ลองดูตัวอย่างว่าเราจะบรรลุเป้าหมายนี้ได้อย่างไร

db.Employee.insert({_id:10, "EmployeeName" : "Smith"})

Code คำอธิบาย:

  1. เรากำลังสมมติว่าเรากำลังสร้างเอกสารแรกในคอลเลกชัน และด้วยเหตุนี้ในคำสั่งข้างต้นในขณะที่สร้างคอลเลกชัน เราจะกำหนดฟิลด์ _id อย่างชัดเจนและกำหนดค่าให้กับมัน

หากดำเนินการคำสั่งสำเร็จแล้วและตอนนี้ใช้คำสั่งค้นหาเพื่อแสดงเอกสารในคอลเล็กชั่น จะแสดงผลลัพธ์ต่อไปนี้

Output:

คีย์หลักเข้า MongoDB

ผลลัพธ์แสดงให้เห็นอย่างชัดเจนว่าฟิลด์ _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 แบบกำหนดเองได้ เช่น ที่อยู่อีเมลหรือรหัสสินค้า เมื่อคีย์ทางธุรกิจที่เป็นธรรมชาติทำให้การค้นหาง่ายขึ้น การเลือกที่เหมาะสมขึ้นอยู่กับว่าคุณวางแผนที่จะค้นหาและเชื่อมโยงข้อมูลของคุณอย่างไร

คำถามที่พบบ่อย

ไม่ ฟิลด์ _id ไม่สามารถเปลี่ยนแปลงได้หลังจากสร้างเอกสารแล้ว หากต้องการเปลี่ยนแปลง คุณต้องลบเอกสารเดิมและสร้างเอกสารใหม่โดยใส่ค่า _id ที่ต้องการ

ฟิลด์ _id รองรับประเภทข้อมูล BSON ส่วนใหญ่ รวมถึง ObjectId, จำนวนเต็ม, สตริง และแม้แต่เอกสารฝังตัว กฎเพียงข้อเดียวคือค่าต้องไม่ซ้ำกันภายในคอลเลกชันและต้องไม่ใช่อาร์เรย์

ใช่. MongoDB สร้างดัชนีเฉพาะบนฟิลด์ _id สำหรับทุกคอลเลกชันโดยอัตโนมัติ ดัชนีนี้ไม่สามารถลบได้ และทำให้การค้นหาโดยใช้คีย์หลักรวดเร็วมาก

AI สามารถอธิบายไทม์สแตมป์ของ ObjectId และสร้างโค้ดเพื่อแสดงผลได้tracคำนวณเวลาสร้างด้วย getTimestamp() และแปลง ObjectIds เป็นสตริง ช่วยด้วยping นักพัฒนาสามารถแก้ไขข้อผิดพลาดและทำความเข้าใจตัวระบุเอกสารได้รวดเร็วยิ่งขึ้น

ใช่แล้ว AI สามารถให้คำแนะนำได้ว่าควรใช้ ObjectId เริ่มต้น หรือใช้ _id ที่กำหนดเอง เช่น อีเมลหรือ UUID โดยพิจารณาจากรูปแบบการค้นหา ความต้องการด้านความเป็นเอกลักษณ์ และแผนการแบ่งส่วนข้อมูลของคุณ

สรุปโพสต์นี้ด้วย: