Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js – 我可以在MongoDB的聚合查询中申请forEach吗?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个成员集合,并按特定条件查找成员,在获得成员后,我需要为每个成员进行一些计算.计算需要查询一个集合.

我的过程是

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]}]},sameCount: { $sum: {$cond:[{$eq: ["$numberOfInvitees",0]} }
      }
    }
  ]).toArray();

   eachMemberInfo.push({memberId:doc.memberId,memberCount: result[0].memberCount,lessCount: result[0].lessCount});

});

我的问题是如何使用单个聚合查询来执行此操作?

任何人都可以帮助我:)

例如:

会员集合如:

[{
    "_id" : ObjectId("57905b2ca644ec06142a8c06"),"memberID" : 80,"memberType" : "N","numberOfInvitees" : 2,"createdDate" : ISODate("2016-07-21T00:00:00.000Z"),"country" : "BD"
},{
    "_id" : ObjectId("57905b2ca644ec06142a8c09"),"memberID" : 81,"numberOfInvitees" : 3,"country" : "BD"
}
{
    "_id" : ObjectId("57905b2ca644ec06142a8fgh"),"memberID" : 82,"numberOfInvitees" : 4,"country" : "BD"
}
{
    "_id" : ObjectId("57905b2ca644ec06142a8cfgd"),"memberID" : 83,"numberOfInvitees" : 1,"memberID" : 84,"country" : "BD"
}
..............
]

每个会员信息中的预期结果如:

[
  { memberID : 80,memberCount:5,lessCount: 1,sameCount:2 },{ memberID : 81,lessCount: 3,sameCount:1 },{ memberID : 82,lessCount: 4,{ memberID : 83,lessCount: 0,{ memberID : 84,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] },0 ] } 
                },"sameCount": { "$sum": 1 } 
            }
        }
    ];

collection.aggregate(pipeline,function(err,result){
    if (err) throw err;
    console.log(result);
});

updatE

跟进您的问题的更改,运行以下聚合管道将为您提供所需的结果:

var collection = db.collection('member'),pipeline = [   
        { "$match": { createdDate: currentDate,{
            "$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"] },0 
                        ] 
                    }
                },"lessInviteesCount": { 
                    "$sum": { 
                        "$cond":[ 
                            { "$lt": ["$inviteesList","memberCount": { "$first": "$memberCount" }
            }
        }
    ];

collection.aggregate(pipeline,result){
    if (err) throw err;
    console.log(result);
});
@H_450_46@

大佬总结

以上是大佬教程为你收集整理的node.js – 我可以在MongoDB的聚合查询中申请forEach吗?全部内容,希望文章能够帮你解决node.js – 我可以在MongoDB的聚合查询中申请forEach吗?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。