Kết hợp $match, $unwind, $sort, $group, $project, $slice
Pipeline aggregation phức tạp: lọc, bẻ mảng, sắp xếp, nhóm lại, cắt lấy N phần tử đầu.
Dữ liệu mẫu
> db.demo762.insertOne({
_id: { userId: 101, userName: "Chris" },
countryName: "US",
details: [
{ Name: "Robert", DueDate: "2020-04-10" },
{ Name: "Robert", DueDate: "2020-04-09" },
{ Name: "Robert", DueDate: "2020-03-06" }
]
});
Truy vấn: lấy 2 bản ghi DueDate sớm nhất
db.demo762.aggregate([
{ $match: { _id: { $eq: { userId: 101, userName: "Chris" } } } },
{ $unwind: "$details" },
{ $sort: { "details.DueDate": 1 } },
{
$group: {
_id: "$_id",
details: { $push: "$details" },
countryName: { $first: "$countryName" }
}
},
{ $project: { details: { $slice: ["$details", 2] }, countryName: 1 } }
]).pretty();
Kết quả
{
"_id": { "userId": 101, "userName": "Chris" },
"countryName": "US",
"details": [
{ "Name": "Robert", "DueDate": "2020-03-06" },
{ "Name": "Robert", "DueDate": "2020-04-09" }
]
}
$slice: ["$details", 2] lấy 2 phần tử đầu sau khi sắp xếp tăng dần (DueDate sớm nhất).