使用 UNIX 毫秒时间的 Mongo groupby 月份

joh*_*ohn 2 mongodb mongodb-query aggregation-framework

我有一个 Mongo 集合,如下所示:

[{
    id: 1,
    timestamp: 1534488870841,
    type: 'deposit'
}, {
    id: 1,
    timestamp: 1534488915119,
    type: 'deposit'
}]
Run Code Online (Sandbox Code Playgroud)

如何查询以列出deposit按月份分组的所有交易。

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

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

db.getCollection('transactions').find(
{"type":"deposit"});
Run Code Online (Sandbox Code Playgroud)

编辑:Mongo 3.4 版

Ash*_*shh 5

您可以在 mongodb 4.0 中尝试以下聚合

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

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

您可以在 mongodb 3.4 中尝试以下聚合

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

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