Lọc subdocument trong mảng với $filter aggregation
Sử dụng $match tìm document cha, sau đó $addFields với $filter để chỉ giữ subdocument khớp điều kiện.
Dữ liệu UserDetails
> db.demo345.insertOne({
"UserName": "Robert",
"UserDetails": [
{ "isMarried": false, "CountryName": "US" },
{ "isMarried": true, "CountryName": "UK" },
{ "isMarried": false, "CountryName": "AUS" }
]
});
Pipeline lọc isMarried = true
> db.demo345.aggregate([
{ $match: { UserName: "Robert" } },
{
$addFields: {
UserDetails: {
$filter: {
input: "$UserDetails",
cond: { $eq: ["$$this.isMarried", true] }
}
}
}
}
]);
Kết quả
{
"_id": ObjectId("..."),
"UserName": "Robert",
"UserDetails": [{ "isMarried": true, "CountryName": "UK" }]
}
Đặc điểm: Trả về document gốc nhưng mảng UserDetails chỉ chứa phần tử thỏa mãn. Document gốc không bị sửa đổi.