如何使用mongodb存储桶作为日期移动时间

问题描述 投票:0回答:1

例如,我有以下数据。

{  
   "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?

mongodb mongoose
1个回答
0
投票

您需要将$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")
    ]
  }
]

稍后,您可以根据需要对其进行排序。

© www.soinside.com 2019 - 2024. All rights reserved.