带有nodejs的Monodb - 在计数结果后用组查询

时间:2017-01-13 10:15:14

标签: node.js mongodb mongodb-query aggregation-framework

我有以下集合,代表会员去健身房时的滑动记录。

{
    "_id" : ObjectId(""),
    "content" : {
        "Date_Key" : "",
        "TRANSACTION_EVENT_KEY" : "",
        "SITE_NAME" : "",
        "Swipe_DateTime" : "",
        "Gender" : "",
        "Post_Out_Code" : "",
        "Year_Of_Birth" : "",
        "Time_Key" : "",
        "MemberID_Hash" : "",
        "Member_Key_Hash" : "",
        "Swipes" : ""
    },
    "collection" : "observations"
}

我想在一个月内返回每个健身房滑动次数的成员数量。 例如:

{
   {"nrOfGymSwipes": 0, "nrOfMembers": 10}, // 10 members who swiped 0 times
   {"nrOfGymSwipes": 1, "nrOfMembers": 15}, // 15 members who swiped once
   {"nrOfGymSwipes": 2, "nrOfMembers": 17}, 
   ...
}

我尝试了以下内容:

collection
            .aggregate(
            [{$match: {"content.Swipe_DateTime": {$regex:"201602"}}},
            {$group: {_id: "$content.MemberID_Hash", "nrOfGymSwipes":{$sum: 1}}},
            {$sort: {"nrOfGymSwipes": 1}}],

为每个成员返回给定月份中的滑动次数。

.........    
    { _id: '111', nrOfGymSwipes: 16 },
    { _id: '112', nrOfGymSwipes: 16 },
    { _id: '113', nrOfGymSwipes: 17 },
...............

现在我正在考虑通过健身房刷卡的次数进行分组并计算ID,尝试了这个但是它没有回复我的预期

collection
            .aggregate(
            [{$match: {"content.Swipe_DateTime": {$regex:"201602"}}},
            {$group: {_id: "$content.MemberID_Hash", "nrOfGymSwipes":{$sum: 1}}},
            {$group: {_id: "nrOfGymSwipes", "nrOfMembers":{$sum: 1}}}, <---added this
            {$sort: {"nrOfGymSwipes": 1}}],

知道如何解决这个问题吗? 还有,有办法改变我获得json输出的方式吗?例如,而不是显示 _id:&#34; 32131&#34; 部分,输出 nrOfMembers:&#34; 312321&#34;

1 个答案:

答案 0 :(得分:1)

您的最后一组几乎就在那里,您只需要在$密钥前加上"_id",以指示滑动字段的数量。 $sort管道是另一个问题所在,因为您尝试排序的字段不存在。聚合管道的前提是,管道中的一个阶段的结果作为修改后的文档传递给下一个(具有取决于聚合操作的结构),最后一个组管道只生成两个字段"nrOfMembers""nrOfGymSwipes"

您可以使用 $project 管道步骤,以便$sort阶段能够正常工作,因为它会替换之前的{_id字段。 {1}}键,然后您可以获得所需结构的最终输出。所以你最终的聚合操作应该是:

collection.aggregate([
    { "$match": { "content.Swipe_DateTime": { "$regex":"201602" } } },
    { "$group": { "_id": "$content.MemberID_Hash", "nrOfGymSwipes": { "$sum": 1 } } },
    { "$group": { "_id": "$nrOfGymSwipes", "nrOfMembers": { "$sum": 1 } } }, 
    { "$project": { "_id": 0, "nrOfGymSwipes": "$_id", "nrOfMembers": 1 } },
    { "$sort": { "nrOfGymSwipes": 1 } }
], function (err, result) { ... });