Mongo按月使用UNIX毫秒分组

时间:2018-08-17 06:57:45

标签: mongodb mongodb-query aggregation-framework

我有一个Mongo集合,看起来如下:

[{
    id: 1,
    timestamp: 1534488870841,
    type: 'deposit'
}, {
    id: 1,
    timestamp: 1534488915119,
    type: 'deposit'
}]

如何进行查询以列出所有deposit交易,按月分组。

必须使用timestamp属性(UNIX毫秒)来计算月份。

我可以按如下方式获得押金,但不确定如何分组:

db.getCollection('transactions').find(
{"type":"deposit"});

编辑:Mongo 3.4版

1 个答案:

答案 0 :(得分:3)

您可以在mongodb 4.0

中尝试以下聚合

您可以使用$toDate聚合将timestamp转换为日期,然后使用$group聚合将$month转换为日期

db.collection.aggregate([
  { "$match": { "type": "deposits" }},
  { "$addFields": {
    "date": {
      "$toDate": "$timestamp"
    }
  }},
  { "$group": {
    "_id": { "$month": "$date" },
    "deposits": {
      "$push": "$$ROOT"
    }
  }}
])

您可以在mongodb 3.4

中尝试以下聚合

3.4 中,您可以通过在其中添加timestamp$group使用$dateToString聚合将new Date()转换为日期

db.collection.aggregate([
  { "$match": { "type": "deposits" }},
  { "$addFields": {
    "date": {
      "$add": [ new Date(0), "$timestamp" ]
    }
  }},
  { "$group": {
    "_id": {
      "$dateToString": {
        "format": "%m",
        "date": "$date"
      }
    },
    "deposits": {
      "$push": "$$ROOT"
    }
  }}
])