Sử dụng $expr kết hợp $let và $arrayElemAt để truy vấn dựa trên điều kiện áp dụng lên subdocument trong mảng (ví dụ: phần tử cuối cùng).
Tạo collection với mảng subdocument có ngày tháng:
> 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' }
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5e716817aa3ef9ab8ab202") }
Xem dữ liệu:
> db.demo394.find();
Tìm tài liệu có phần tử **cuối cùng** của mảng details có endDate bằng giá trị cụ thể:
> db.demo394.find({ "$expr": { "$let": { "vars": { "d": { "$arrayElemAt": [ "$details", -1 ] } }, "in": { "$eq": [ "$$d.endDate", "2020-01-04T07:59:59.999Z" ] } } } })Kết quả (trả về tài liệu thỏa mãn):
Phân tích:
$arrayElemAt: ["$details", -1]: lấy phần tử cuối cùng của mảng (index -1)$let: gán vào biếndđể tham chiếu dễ dàng$eq: so sánh trường endDate của biến d với chuỗi ngày tháng$expr: cho phép dùng aggregation expression trong find()
Mở rộng: Có thể dùng $filter trong $expr để lọc subdocument theo điều kiện phức tạp hơn.