1

我有一个看起来像的文件,

{
    "_id" : ObjectId("57dffd3b65291f06dab34385"),
    "user" : "12345667890"
    "time" : NumberLong(1474297140186)
}

我正在尝试计算某个应用程序的访问者数量。我有 64 个字段,我的查询如下所示。

db.convo_log.aggregate([
   {
       '$group': {
            '_id': { 
                month: { $month: new Date("$time") }, 
                day: { $dayOfMonth: new Date("$time") }, 
                year: { $year: new Date("$time") } 
            }, 
            'count': { '$sum': 1 }
       }
   }
])

即使我正在寻找几个组(因为有来自不同日期的数据)它返回为,

{
    "_id" : {
        "month" : 8,
        "day" : 17,
        "year" : 292278994
    },
    "count" : 64.0
}

我在这里做错了什么吗?

4

1 回答 1

2

您不能以这种方式从时间戳创建日期对象表示。您需要使用算术运算符进行一些算术操作,即对象构造函数$add的时间戳,new Date(0)它将日期表示为距纪元 0 毫秒(尽管形式更短)。

总和{ "$add": ["$time", new Date(0)] }产生一个新的日期对象。因此,将其与$dateToString运算符一起使用,您可以运行此管道以获得所需的结果:

db.convo_log.aggregate([
    {
        "$project": {
            "formattedDate": {
                "$dateToString": {
                    "format": "%Y-%m-%d",
                    "date": { "$add": ["$time", new Date(0)] }
                }
            }
        }
    },
    {
        "$group": {
            "_id": "$formattedDate",
            "count": { "$sum": 1 }
        }
    }
])
于 2016-09-28T12:20:25.843 回答