按日期分组mongoDB

时间:2016-03-15 19:07:37

标签: mongodb aggregation-framework

我在mongoDB中有一组数据,我必须按$timestamp分组。该字段包含日期,但格式为String(上面的示例数据)。

我应该如何将$timestamp转换为日期,以便我可以将它们组合在一起?

接下来,我必须为每个日期和标识加上每个scores_today,并对每个scores_total加上相同的结果。

示例数据:

[
    {
        _id: "1442",
        timestamp: "2016-03-15T22:24:02.000Z",
        iden: "15",
        scores_today: "0.000000",
        scores_total: "52337.000000"
    }
]

我的代码

var project = {
            "$project":{ 
                "_id": 0,
                "y": {
                    "$year": "$timestamp"      // tried this way, not working
                    },
                "m": {
                    "$month": new Date("$timestamp") // tried either this, not working
                }, 
                "d": {
                    "$dayOfMonth":  new Date("$timestamp")
                },
                "iden" : "$iden"
            } 
        },
        group = {   
            "$group": { 
                "_id": { 
                    "iden" : "$iden",
                    "year": "$y", 
                    "month": "$m", 
                    "day": "$d"
                },  
                "count" : { "$sum" : "$scores_today" }
            }
        };
        mongoDB.collection('raw').aggregate([ project, group ]).toArray()....

这是node.js服务记录的错误

  

错误:{[MongoError:异常:无法从BSON类型字符串转换为   日期]名称:' MongoError',邮件:'例外:无法转换自   BSON类型String to Date',errmsg:' exception:无法转换   BSON类型String to Date',代码:16006,ok:0}

1 个答案:

答案 0 :(得分:2)

您可以使用ISODate($timestamp)从字符串构造Date对象。

var project = {
            "$project":{ 
                "_id": 0,
                "y": {
                    "$year": ISODate("$timestamp").getFullYear()
                    },
                "m": {
                    "$month": ISODate("$timestamp").getMonth()+1 // months start from 0
                }, 
                "d": {
                    "$dayOfMonth":  ISODate("$timestamp").getDate()
                },
                "iden" : "$iden"
            } 
        },
        group = {   
            "$group": { 
                "_id": { 
                    "iden" : "$iden",
                    "year": "$y", 
                    "month": "$m", 
                    "day": "$d"
                },  
                "count" : { "$sum" : "$scores_today" }
            }
        };

<强>更新

如果您没有运行MongoDb shell,则无法直接使用ISODate。在这种情况下,尝试调用eval命令。

var aggregationResult=mongoDB.eval(
'
'function()                                                                                '+
'{                                                                                         '+
'  var project = {                                                                         '+
'              "$project":{                                                                '+ 
'                  "_id": 0,                                                               '+
'                  "y": {                                                                  '+
'                      "$year": ISODate("$timestamp").getFullYear()                        '+
'                      },                                                                  '+
'                  "m": {                                                                  '+
'                      "$month": ISODate("$timestamp").getMonth()+1 // months start from 0 '+
'                  },                                                                      '+
'                  "d": {                                                                  '+
'                      "$dayOfMonth":  ISODate("$timestamp").getDate()                     '+
'                  },                                                                      '+
'                  "iden" : "$iden"                                                        '+
'              }                                                                           '+
'          },                                                                              '+
'          group = {                                                                       '+
'              "$group": {                                                                 '+
'                  "_id": {                                                                '+
'                      "iden" : "$iden",                                                   '+
'                      "year": "$y",                                                       '+
'                      "month": "$m",                                                      '+
'                      "day": "$d"                                                         '+
'                  },                                                                      '+
'                  "count" : { "$sum" : "$scores_today" }                                  '+
'              }                                                                           '+
'          };  
'    var result=db.raw.aggregate([ project, group ]);                  '+
'    return result;                                                                        '+        
'  }                                                                                       '+
'
);