我有一份看起来像
的文件{
"_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
}
我在这里做错了吗?
答案 0 :(得分:2)
您无法通过该方式从时间戳创建日期对象表示。您需要使用arithmetic operators进行一些算术操作,即 $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 }
}
}
])