gpt4 book ai didi

node.js - 我可以在 MongoDB 的聚合查询中申请 forEach 吗?

转载 作者:IT老高 更新时间:2023-10-28 13:35:55 25 4
gpt4 key购买 nike

我有一个成员集合,根据特定条件查找成员,在获取成员后,我需要对每个成员进行一些计算。在同一个集合上计算需要查询。

我的过程是

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);
});

关于node.js - 我可以在 MongoDB 的聚合查询中申请 forEach 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38496419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com