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

MongoDB: ค้นหาเอกสารที่ Property id เท่ากับ _id ของ Record เดียวกัน

เปรียบเทียบ _id กับฟิลด์ภายในเอกสารด้วย $where

บทความนี้สาธิตการใช้ $where พร้อม JavaScript Function เพื่อเปรียบเทียบค่า _id ของเอกสารกับค่า Details.id ภายในเอกสารเดียวกัน (Self-referencing Comparison)

ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง

> db.demo69.insertOne({
    "_id": ObjectId("507c7f79bcf86cd7994f6c0e"),
    "Details": { "id": ObjectId("507c7f79bcf86cd7994f6c0e") }
});
{ "acknowledged": true, "insertedId": ObjectId("507c7f79bcf86cd7994f6c0e") }

> db.demo69.insertOne({
    "_id": ObjectId("507c7f79bcf86cd7994f6c0f"),
    "Details": { "id": ObjectId("507c7f79bcf86cd7994f6c0a") }
});
{ "acknowledged": true, "insertedId": ObjectId("507c7f79bcf86cd7994f6c0f") }

ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด

> db.demo69.find();

ผลลัพธ์: เอกสารแรก _id == Details.id, เอกสารที่สอง _id != Details.id

ขั้นตอนที่ 3: ใช้ $where เปรียบเทียบ _id กับ Details.id

> db.demo69.find({
    $where: function(){
        return this._id.toString() == this.Details.id.toString();
    }
}).pretty();

ผลลัพธ์ที่ได้

{ "_id": ObjectId("507c7f79bcf86cd7994f6c0e"), "Details": { "id": ObjectId("507c7f79bcf86cd7994f6c0e") } }

สรุป:

  • $where อนุญาตให้ใช้ JavaScript Function ใน Query ได้
  • this หมายถึงเอกสารปัจจุบัน
  • ต้องใช้ .toString() เพราะ ObjectId ไม่สามารถเปรียบเทียบด้วย == ได้โดยตรง
  • คำเตือน: $where ช้า (ไม่ใช้ Index ได้) ควรหลีกเลี่ยงใน Production หรือใช้เฉพาะกรณีที่ไม่มีทางเลือกอื่น