Kann ich mich bewerben, forEach in der Aggregat-Abfrage in MongoDB?
Habe ich ein Mitglied der Sammlung und finden Sie die Mitglieder durch die spezifischen Bedingungen und nach erhalten die Mitglieder, die ich brauche, um einige der Berechnung für jedes Mitglied. Zum berechnen brauchen-Abfrage auf die gleiche Sammlung.
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 dies tun, mit Einzel-Aggregat-Abfrage?
kann einer mir helfen pls 🙂
Zum Beispiel:
Mitglied Kollektion 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"
}
..............
]
Erwartete 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 }
]
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht mit der aggregation pipeline. Sie sollten verstehen, dass MongoDB aggregation eine Reihe von speziellen Operatoren angewendet, um eine Sammlung. Beim ausführen einer aggregation pipeline, MongoDB pipes-Operatoren Ineinander, D. H. der Ausgang der Bediener wird zur Eingabe des folgenden operators. Das Ergebnis jeder operator ist eine neue Sammlung von Dokumenten.
Daher, was Sie versuchen zu erreichen, die oben erwähnt sind, können einfach umgeschrieben, wie in der folgenden pipeline, ohne die Notwendigkeit zu erstellen, die ein array von Dokumenten ersten:
UPDATE
Follow-up, um die änderungen zu deiner Frage, läuft die folgende aggregation pipeline geben Sie das gewünschte Ergebnis:
lessCount:
wie kann ich mich bewerben ? aktualisiert meine Frage_id, memberCount, sameCount
aber ich brauchememberCount, sameCount
für jedes Mitgliedskip
undlimit
zu finden Mitglieder was wird sich ändern in der Abfrage? wie:var members = db.collection('member').find({ createdDate: currentDate, country: 'BD'}).skip(size).limit(1000).toArray();
aber mein Aggregat Abfrage nicht geändert hat @chridam$limit
undskip
pipeline-Betreiber. Nicht sicher, wie Sie Ihre Ergebnisse Stift heraus, da Sie die Daten von hand, warum nicht Sie geben, die gehen und sehen, wie die Tarife?skip
undlimit
dann die Abfrage falsche Ergebnis. sagen, wenn ich{"$sort":{"_id":1}},{"$skip":0},{"$limit":3},
es return Ergebnis für id=80{ memberID : 80, memberCount:3,lessCount: 0,sameCount:1 },
weil der für die 80 nur vergleichen und zählen, 80,81 und 83, aber ich brauche zu vergleichen, für die 80 mit allen Mitgliedern wie 80,81,82,83,84 dann gibt es genaue Ergebnis. Ergebnis sollte das gleiche sein, wie die vorherigen.