2016-07-21 6 views
3

Ich habe eine Mitgliedersammlung und finde Mitglieder nach bestimmten Bedingungen und nachdem ich Mitglieder bekommen habe, muss ich ein paar Berechnungen für jedes Mitglied machen. Zur Berechnung der Notwendigkeit Abfrage für die gleiche Sammlung.Kann ich in der MongoDB eine Abfrage für "Jeder in Aggregat" beantragen?

Mein Prozess ist

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

}); 

Meine Frage ist, wie kann ich diese mit einzelnen Aggregatabfrage zu tun?

kann mir einer helfen pls :)

Zum Beispiel:

Mitglied Sammlung wie:

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

Erwartetes Ergebnis in eachMemberInfo wie:

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

Antwort

3

Das ist mit der Aggregationspipeline nicht möglich. Sie sollten verstehen, dass die MongoDB-Aggregation eine Reihe spezieller Operatoren ist, die auf eine Sammlung angewendet werden. Wenn Sie eine Aggregationspipeline ausführen, leitet MongoDB Operatoren ineinander, d. H. Die Ausgabe eines Operators wird zur Eingabe des folgenden Operators. Das Ergebnis jedes Operators ist eine neue Sammlung von Dokumenten.

So was Sie versuchen, in der oben zu erreichen, kann einfach als die folgende Pipeline ohne die Notwendigkeit, neu geschrieben werden, um eine Reihe von Dokumenten zuerst zu erstellen:

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

Im Anschluss an die Änderungen an Ihrer Frage führt das Ausführen der folgenden Aggregationspipeline zu dem gewünschten Ergebnis:

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

Vielen Dank für Ihr Relais @chridam und wenn wir diese 'lessCount berechnen möchten: 'Wie kann ich mich bewerben? aktualisiert meine Frage –

+0

Ihre Abfrage return einzelnes Objekt mit '_id, memberCount, sameCount' aber ich brauche' memberCount, sameCount' für jedes Mitglied –

+0

Hallo @chridam Ich aktualisiere meine Frage mit Beispiel –

Verwandte Themen