Sử dụng $filter trong $project để lọc phần tử trong mảng dựa trên so sánh với trường khác của document.
Tạo collection demo137:
> db.demo137.insertOne({
Name1:"Chris", Name2:"David",
Detail1:[{_id:"John",Name3:"Chris"},{_id:"Chris",Name3:"Chris"}],
Detail2:[{_id:"David",Name3:"Chris"},{_id:"Carol",Name3:"Chris"},{_id:"John",Name3:"Chris"}]
});
Pipeline: filter Detail1 giữ phần tử _id = Name1, filter Detail2 giữ _id = Name2:
> db.demo137.aggregate([
{
$project: {
_id: 0, Name1: 1, Name2: 1,
Detail1: {
$filter: {
input: "$Detail1",
as: "out",
cond: { $eq: ["$$out._id", "$Name1"] }
}
},
Detail2: {
$filter: {
input: "$Detail2",
as: "out",
cond: { $eq: ["$$out._id", "$Name2"] }
}
}
}
}
])
Kết quả chỉ giữ subdocument khớp:
{
"Name1" : "Chris",
"Name2" : "David",
"Detail1" : [{"_id":"Chris","Name3":"Chris"}],
"Detail2" : [{"_id":"David","Name3":"Chris"}]
}