2016-07-21 7 views
3

私はメンバーコレクションを持っていて、特定の条件でメンバーを見つけて、メンバーを取得した後、メンバーごとに計算をする必要があります。同じコレクションに対して必要なクエリを計算する。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]}]},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}); 

}); 

である私の質問はどのように私は、この単一の集計クエリを使用して行うことができますか?

いずれか:) plsは私を助けることができる

例えば:

メンバーコレクションのように:eachMemberInfo

[{ 
    "_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" 
} 
.............. 
] 

期待される結果のように:

[ 
    { 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 } 
] 

答えて

3

アグリゲーションパイプラインではこれを実行できません。 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); 
}); 

UPDATE

あなたの質問の変更をフォローアップし、以下のアグリゲーションパイプラインを実行すると、望ましい結果が得られます。

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

リレー@chridamをご利用いただき、ありがとうございます。この「lessCount:」を計算したい場合は、どのように適用できますか?私の質問が更新されました –

+0

あなたのクエリは '_id、memberCount、sameCount'で単一のオブジェクトを返しますが、メンバーごとに' memberCount、sameCount'が必要です –

+0

こんにちは@chridam私の質問を例で更新します –

関連する問題