Bạn không thể làm điều đó với đường ống tổng hợp. Bạn nên hiểu rằng tập hợp MongoDB là một loạt các toán tử đặc biệt được áp dụng cho một tập hợp. Khi bạn thực hiện một đường ống tổng hợp, MongoDB sẽ chuyển các toán tử vào nhau, tức là đầu ra của một toán tử sẽ trở thành đầu vào của toán tử sau. Kết quả của mỗi toán tử là một tập hợp tài liệu mới.
Do đó, những gì bạn đang cố gắng đạt được ở trên có thể được viết lại đơn giản dưới dạng đường dẫn sau mà không cần phải tạo một mảng tài liệu trước:
var collection = db.collection('member'),
pipeline = [
{ "$match": { createdDate: currentDate, country: 'BD' } },
{
"$group": {
"_id": { "memberType": "$memberType", "country": "$country" },
"memberCount": {
"$sum": { "$cond":[ { "$gt": ["$numberOfInvitees", 0] }, 1, 0 ] }
},
"sameCount": { "$sum": 1 }
}
}
];
collection.aggregate(pipeline, function(err, result){
if (err) throw err;
console.log(result);
});
CẬP NHẬT
Theo dõi các thay đổi đối với câu hỏi của bạn, chạy đường dẫn tổng hợp sau đây sẽ cho bạn kết quả mong muốn:
var collection = db.collection('member'),
pipeline = [
{ "$match": { createdDate: currentDate, country: 'BD' } },
{
"$group": {
"_id": {
"memberType": "$memberType",
"country": "$country"
},
"invitees":{
"$push": {
"memberID": "$memberID",
"count": "$numberOfInvitees"
}
},
"inviteesList": { "$push": "$numberOfInvitees" },
"memberCount": { "$sum": 1 }
}
},
{ "$unwind": "$invitees" },
{ "$unwind": "$inviteesList" },
{
"$group": {
"_id": "$invitees.memberID",
"sameInviteesCount": {
"$sum": {
"$cond": [
{ "$eq": ["$inviteesList", "$invitees.count"] },
1, 0
]
}
},
"lessInviteesCount": {
"$sum": {
"$cond":[
{ "$lt": ["$inviteesList", "$invitees.count"] },
1, 0
]
}
},
"memberCount": { "$first": "$memberCount" }
}
}
];
collection.aggregate(pipeline, function(err, result){
if (err) throw err;
console.log(result);
});