เปรียบเทียบ _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 หรือใช้เฉพาะกรณีที่ไม่มีทางเลือกอื่น