我有一个成员集合,根据特定条件查找成员,在获取成员后,我需要对每个成员进行一些计算。在同一个集合上计算需要查询。
我的过程是
var eachMemberInfo = [];
var members = db.collection('member').find({ createdDate: currentDate, country: 'BD'}).toArray();
members.forEach(function(doc) {
var result = db.collection('member').aggregate([
{ $match: { memberType: doc.memberType, country : doc.country } },
{
$group: {
_id: {memberType:"$memberType",country:"$country"},
memberCount: { $sum: {$cond:[{$gt: ["$numberOfInvitees",0]},1,0]} },
lessCount: { $sum: {$cond:[{$and:[{$lt:["$numberOfInvitees", doc.numberOfInvitees]}, {$gt: ["$numberOfInvitees",0]}]},1,0]} },
sameCount: { $sum: {$cond:[{$eq: ["$numberOfInvitees",doc.numberOfInvitees]},1,0]} }
}
}
]).toArray();
eachMemberInfo.push({memberId:doc.memberId,memberCount: result[0].memberCount, lessCount: result[0].lessCount});
});
我的问题是如何使用单个聚合查询来做到这一点?
谁能帮帮我:)
例如:
成员(member)收藏喜欢:
[{
"_id" : ObjectId("57905b2ca644ec06142a8c06"),
"memberID" : 80,
"memberType" : "N",
"numberOfInvitees" : 2,
"createdDate" : ISODate("2016-07-21T00:00:00.000Z"),
"country" : "BD"
},
{
"_id" : ObjectId("57905b2ca644ec06142a8c09"),
"memberID" : 81,
"memberType" : "N",
"numberOfInvitees" : 3,
"createdDate" : ISODate("2016-07-21T00:00:00.000Z"),
"country" : "BD"
}
{
"_id" : ObjectId("57905b2ca644ec06142a8fgh"),
"memberID" : 82,
"memberType" : "N",
"numberOfInvitees" : 4,
"createdDate" : ISODate("2016-07-21T00:00:00.000Z"),
"country" : "BD"
}
{
"_id" : ObjectId("57905b2ca644ec06142a8cfgd"),
"memberID" : 83,
"memberType" : "N",
"numberOfInvitees" : 1,
"createdDate" : ISODate("2016-07-21T00:00:00.000Z"),
"country" : "BD"
}
{
"_id" : ObjectId("57905b2ca644ec06142a8cfgd"),
"memberID" : 84,
"memberType" : "N",
"numberOfInvitees" : 2,
"createdDate" : ISODate("2016-07-21T00:00:00.000Z"),
"country" : "BD"
}
..............
]
eachMemberInfo 中的预期结果如:
[
{ memberID : 80, memberCount:5,lessCount: 1,sameCount:2 },
{ memberID : 81, memberCount:5,lessCount: 3,sameCount:1 },
{ memberID : 82, memberCount:5,lessCount: 4,sameCount:1 },
{ memberID : 83, memberCount:5,lessCount: 0,sameCount:1 },
{ memberID : 84, memberCount:5,lessCount: 1,sameCount:2 }
]
最佳答案
聚合管道无法做到这一点。你应该明白 MongoDB 聚合是一系列应用于集合的特殊运算符。当您执行聚合管道时,MongoDB 将运算符相互传递,即运算符的输出成为以下运算符的输入。每个运算符的结果是一个新的文档集合。
因此,您在上面尝试实现的目标可以简单地重写为以下管道,而无需先创建文档数组:
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);
});
更新
跟进您的问题的更改,运行以下聚合管道将为您提供所需的结果:
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);
});
https://stackoverflow.com/questions/38496419/
相关文章:
node.js - Nodejs 我需要使用 Passport
node.js - 如何使用 MongoDB 按名字和姓氏搜索用户?
json - 如何使用 Pentaho 从 json 中的三个表到 mongodb 执行复杂文档
node.js - 我的 Electron 应用程序启动时如何启动 mongodb 服务
mongodb - 如何从 mongodb 集合中删除空字符串?
mongodb - 使用 mongoose 正则表达式与文本在 mongodb 中搜索
node.js - Mongoose 在未指定的时间段后停止响应
ruby-on-rails - 在 Rails 控制台中列出所有 Mongoid 模型