Sử dụng $filter, $let, $slice trong $addFields
Kết hợp $filter để lọc mảng, $let định nghĩa biến trung gian, $slice lấy phần tử cuối cùng.
Dữ liệu mẫu
> db.demo751.insertOne({
_id: 101,
details: [
{ Name: "Robert", id: 110, Age: 21 },
{ Name: "Rae", id: 110, Age: 22 },
{ Name: "Ralph", id: 116, Age: 23 }
]
});
Truy vấn: lọc phần tử có id=110, lấy phần tử cuối cùng
db.demo751.aggregate([
{
$addFields: {
details: {
$let: {
vars: {
filtered: {
$filter: {
input: "$details",
as: "out",
cond: { $eq: ["$$out.id", 110] }
}
}
},
in: { $slice: ["$$filtered", -1] }
}
}
}
}
]);
Kết quả
{ "_id": 101, "details": [{ "Name": "Rae", "id": 110, "Age": 22 }] }
Trong các phần tử có id=110, lấy phần tử cuối cùng (Rae, Age 22).