ใช้ $expr ร่วม $let, $arrayElemAt เพื่อเข้าถึง Sub-document เฉพาะในอาร์เรย์ (เช่น ตัวสุดท้าย) แล้วตรวจสอบเงื่อนไข
ตัวอย่างข้อมูลทดสอบ (details มี 2 ช่วงวันที่)
> db.demo394.insertOne({
details: [
{_id: '1', startDate: '2018-01-11T07:00:00.000Z', endDate: '2019-01-12T07:59:59.999Z'},
{_id: '2', startDate: '2019-01-21T07:00:00.000Z', endDate: '2020-01-04T07:59:59.999Z'}
]
});
แสดงข้อมูล
> db.demo394.find();
{
"_id" : ObjectId("5e5e716817aa3ef9ab8ab202"),
"details" : [
{"_id" : "1", "startDate" : "2018-01-11T07:00:00.000Z", "endDate" : "2019-01-12T07:59:59.999Z"},
{"_id" : "2", "startDate" : "2019-01-21T07:00:00.000Z", "endDate" : "2020-01-04T07:59:59.999Z"}
]
}
คิวรี่ค้นหาเอกสารที่ endDate ของรายการสุดท้าย = '2020-01-04T07:59:59.999Z'
> db.demo394.find({
$expr: {
$let: {
vars: { "d": { $arrayElemAt: ["$details", -1] } },
in: { $eq: ["$$d.endDate", "2020-01-04T07:59:59.999Z"] }
}
}
})
ผลลัพธ์ (ตรงเงื่อนไข คืนเอกสารนี้)
{
"_id" : ObjectId("5e5e716817aa3ef9ab8ab202"),
"details" : [
{"_id" : "1", "startDate" : "2018-01-11T07:00:00.000Z", "endDate" : "2019-01-12T07:59:59.999Z"},
{"_id" : "2", "startDate" : "2019-01-21T07:00:00.000Z", "endDate" : "2020-01-04T07:59:59.999Z"}
]
}
คำอธิบาย:
$arrayElemAt: ["$details", -1]ดึงออบเจ็กต์ตัวสุดท้ายของอาร์เรย์ details (index -1 = ตัวหลังสุด)$letกำหนดตัวแปร d = ออบเจ็กต์นั้น$eqเปรียบเทียบ $$d.endDate กับค่าที่ต้องการ$exprอนุญาตให้ใช้ Aggregation Expression ภายใน find()