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

时间:2019-12-12 15:02:05

标签: mongodb mongoose

例如,我的数据如下。

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

1 个答案:

答案 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")
    ]
  }
]

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