Query องค์ประกอบที่ n (Variable Index) ของ Subdocument Array ด้วย $let และ $expr
บทความนี้สาธิตการใช้ $expr ร่วมกับ $let ใน find() เพื่ออ้างอิง Element ที่ Index เฉพาะ (Variable Index) ใน Subdocument Array และทดสอบเงื่อนไข
ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง
> db.demo72.insertOne({
"StudentDetails": [
{ "Name": "Chris", "Age": 21 },
{ "Name": "David", "Age": 23 },
{ "Name": "Bob", "Age": 20 }
]
});
{ "acknowledged": true, "insertedId": ObjectId("5e29b4ad71bf0181ecc42269") }
ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด
> db.demo72.find().pretty();
ผลลัพธ์: StudentDetails มี 3 องค์ประกอบ Index 0, 1, 2
ขั้นตอนที่ 3: Query ตรวจสอบ Element Index 1 (ตัวที่ 2) มี Name = "David"
$let กำหนดตัวแปรชั่วคราว fst = $arrayElemAt: ["$StudentDetails", 1] (Index 1 = ตัวที่ 2)
$expr ใช้ Expression ภายใน Query
in ทดสอบ $eq: ["$$fst.Name", "David"]
> db.demo72.find({
$expr: {
$let: {
vars: { fst: { $arrayElemAt: ["$StudentDetails", 1] } },
in: { $eq: ["$$fst.Name", "David"] }
}
}
})
ผลลัพธ์ที่ได้
{ "_id": ObjectId("5e29b4ad71bf0181ecc42269"), "StudentDetails": [
{ "Name": "Chris", "Age": 21 },
{ "Name": "David", "Age": 23 },
{ "Name": "Bob", "Age": 20 }
] }
สรุป: $let + $arrayElemAt + $expr ช่วยให้สามารถ Query เงื่อนไขที่ซับซ้อนเกี่ยวกับ Array Element โดย Index ได้ โดยเฉพาะเมื่อ Index เป็น Variable หรือคำนวณได้