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

คิวรี่เอกสาร MongoDB ตามเงื่อนไขบน Sub-document

ใช้ $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()