[
{
"rating": 4,
"createdAt": ISODate("2016-08-08T15:32:41.262+0000")
},
{
"rating": 4,
"createdAt": ISODate("2016-08-08T15:32:41.262+0000")
},
{
"rating": 3,
"createdAt": ISODate("2016-07-01T15:32:41.262+0000")
},
{
"rating": 5,
"createdAt": ISODate("2016-07-01T15:32:41.262+0000")
}
]
这是我的数据集。
我用它来获取月数。
[
{
"$project": {
"createdAtMonth": { "$month": "$createdAt" },
"rating": 1
}
},
{
"$group": {
"_id": "$createdAtMonth",
"average": { "$avg": "$rating" },
"month": { "$first": "$createdAtMonth" }
}
}
]
我需要在时间戳中获取该月的开始日期。我该怎么做?
预期输出:
[{
"_id": 8,
"average": 4,
"month": 8,
"time": 1469989800000
}, {
"_id": 7,
"average": 4,
"month": 7,
"time": 1467311400000
}]
此输出中的日期可能不正确。但根据输入,我应该得到两个对象,一个用于 7 月,一个用于 8 月
最佳答案
实现它的一种方法是将任务拆分为 2 个子任务
- 将
yyyy-mm-dd-hh-mm-ss.SSS
的时间戳转换为yyyy-mm-dd-00-00-00.000
的时间戳。这可以使用$mod
来完成算术聚合运算符。 - 将
yyyy-mm-dd-00-00-00.000
的时间戳转换为yyyy-mm-01-00-00-00.000
的时间戳。这可以通过从yyyy-mm-dd-00-00-00.000
的时间戳中减去(dd - 1) * 24 * 60 * 60 * 1000
来完成。
聚合管道
[
{
$project:
{
"createdAtMonth": { $month: "$createdAt" },
"createdAt": 1,
"rating": 1
}
},
{
$group:
{
"_id": "$createdAtMonth",
"createdAt": { $first: "$createdAt" },
"average": { "$avg": "$rating" }
}
},
{
$project:
{
"_id": 0,
"month": "$_id",
"average": 1,
"DD_1": { $subtract: [ { $dayOfMonth: "$createdAt" }, 1 ] },
"t_stamp": { $subtract: [ "$createdAt", new Date("1970-01-01") ] }
}
},
{
$project:
{
"month": 1,
"average": 1,
"time":
{
$subtract:
[
{ $subtract: [ "$t_stamp", { $mod: [ "$t_stamp", 24 * 60 * 60 * 1000 ] } ] },
{ $multiply: [ "$DD_1", 24 * 60 * 60 * 1000 ] }
]
}
}
}
]
示例
{ "_id": 1, "rating": 4, "createdAt": ISODate("2016-08-08T15:32:41.262Z") }
{ "_id": 2, "rating": 3, "createdAt": ISODate("2016-08-08T15:32:41.262Z") }
{ "_id": 3, "rating": 3, "createdAt": ISODate("2016-07-01T15:32:41.262Z") }
{ "_id": 4, "rating": 5, "createdAt": ISODate("2016-07-01T15:32:41.262Z") }
结果
{ "average": 4, "month": 7, "time": 1467331200000 }
{ "average": 3.5, "month": 8, "time": 1470009600000 }
可以在线使用Epoch & Unix Timestamp convertor验证
1467331200000 is timestamp of Fri, 01 Jul 2016 00:00:00 GMT
1470009600000 is timestamp of Mon, 01 Aug 2016 00:00:00 GMT
关于mongodb - 在蒙戈获得一个月的第一天。将 'yyyy-mm-dd-hh-mm-ss.SSS' 转换为 'yyyy-mm-01-00-00-00.000' 的时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39277536/