Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Truy vấn tài liệu theo điều kiện trên subdocument trong MongoDB

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ến d để 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.