Lọc phần tử embedded document trong mảng theo range điểm số
Sử dụng aggregation pipeline với $match, $addFields, $filter để lọc phần tử mảng thỏa mãn khoảng giá trị.
Dữ liệu userDetails
> db.demo346.insertOne({
_id: 101,
userDetails: [
{ UserName: "Chris", Score: 78 },
{ UserName: "David", Score: 68 },
{ UserName: "Bob", Score: 88 }
]
});
> db.demo346.insertOne({
_id: 102,
userDetails: [
{ UserName: "Mike", Score: 92 },
{ UserName": "Sam", Score: 62 },
{ UserName: "Carol", Score: 97 }
]
});
Pipeline lọc Score 80-99
> db.demo346.aggregate([
{
$match: {
$expr: {
$gte: [{ $size: { $ifNull: ["$userDetails", []] } }, 1]
}
}
},
{
$addFields: {
userDetails: {
$filter: {
input: { $ifNull: ["$userDetails", []] },
cond: {
$and: [
{ $gte: ["$$this.Score", 80] },
{ $lte: ["$$this.Score", 99] }
]
}
}
}
}
}
]);
Kết quả
{ "_id": 101, "userDetails": [{ "UserName": "Bob", "Score": 88 }] }
{ "_id": 102, "userDetails": [{ "UserName": "Mike", "Score": 92 }, { "UserName": "Carol", "Score": 97 }] }
Giải thích: $match với $expr lọc document có mảng không rỗng. $filter tạo mảng mới chỉ chứa phần tử Score 80-99.