Lọc và trả về phần tử mảng thỏa mãn điều kiện
Sử dụng $project với $filter trong aggregation để chỉ trả về các phần tử mảng khớp điều kiện, thay vì cả mảng.
Dữ liệu có trường isMarried
> db.demo355.insertOne({
"id": 101,
"details": [
{ "Name": "Chris", "isMarried": 1 },
{ "Name": "David", "isMarried": 0 },
{ "Name": "Mike", "isMarried": 1 }
]
});
Pipeline lọc isMarried = 1
> db.demo355.aggregate([
{
$project: {
details: {
$filter: {
input: "$details",
as: "out",
cond: { $eq: ["$$out.isMarried", 1] }
}
}
}
}
]);
Kết quả
{
"_id": ObjectId("..."),
"details": [
{ "Name": "Chris", "isMarried": 1 },
{ "Name": "Mike", "isMarried": 1 }
]
}
Giải thích:
input: "$details": Mảng nguồnas: "out": Biến đại diện cho từng phần tửcond: Điều kiện lọc, dùng$$outtruy cập phần tử
Khác với $elemMatch projection: $filter trả về tất cả phần tử khớp, $elemMatch chỉ trả về phần tử đầu tiên khớp.