例如,我的数据如下。
{
"id": 1,
"timestamp" : ISODate("2019-10-03T10:00:00.000Z")
},
{
"id": 2,
"timestamp" : ISODate("2019-10-03T21:00:00.000Z")
},
{
"id": 3,
"timestamp" : ISODate("2019-10-04T13:00:00.000Z")
},
{
"id": 4,
"timestamp" : ISODate("2019-10-04T22:00:00.000Z")
},
{
"id": 5,
"timestamp" : ISODate("2019-10-05T13:00:00.000Z")
}
我不得不把时间增加5小时。
因此,我可以在“ $ match”中添加此汇总。
$gte: new Date(new Date('2019-10-03T00:00:00.000Z').setHours(new Date('2019-10-03T00:00:00.000Z').getHours() + 5 )
$lte: new Date(new Date('2019-10-05T23:59:59.999Z').setHours(new Date('2019-10-05T23:59:59.999Z').getHours() + 5 )
但是最后,我想得到这个结果。
{
"2019-10-03":
[
{ "id": 1, "timestamp" : ISODate("2019-10-03T10:00:00.000Z")}
],
"2019-10-04":
[
{ "id": 2, "timestamp" : ISODate("2019-10-03T21:00:00.000Z")},
{ "id": 3, "timestamp" : ISODate("2019-10-04T13:00:00.000Z")}
],
"2019-10-05":
[
{ "id": 4, "timestamp" : ISODate("2019-10-04T22:00:00.000Z")},
{ "id": 5, "timestamp" : ISODate("2019-10-05T13:00:00.000Z")}
]
}
如何通过某些聚合函数获得此结果?
你能推荐一些想法吗?非常感谢您阅读它。
我看到了类似的答案,但是我的情况有所不同,因为必须移动时间。
How do I make buckets according to date in MongoDB?
答案 0 :(得分:2)
您需要将$group
阶段与不重要的_id
字段一起使用。
特殊数字(18000000)是5小时内的毫秒数。
尝试一下:
db.collection.aggregate([
{
"$group": {
"_id": {
"$dateToString": {
"format": "%Y-%m-%d",
"date": {
"$add": [
"$timestamp",
18000000
]
}
}
},
"list": {
"$addToSet": "$timestamp"
}
}
}
])
在您输入的内容上,返回:
[
{
"_id": "2019-10-05",
"list": [
ISODate("2019-10-05T13:00:00Z"),
ISODate("2019-10-04T22:00:00Z")
]
},
{
"_id": "2019-10-03",
"list": [
ISODate("2019-10-03T10:00:00Z")
]
},
{
"_id": "2019-10-04",
"list": [
ISODate("2019-10-03T21:00:00Z"),
ISODate("2019-10-04T13:00:00Z")
]
}
]
稍后,您可以根据需要对其进行排序。