【问题标题】:How to group documents by month?如何按月对文档进行分组?
【发布时间】:2021-12-05 17:31:47
【问题描述】:

我在 mongodb 中有一组交易数据,如下所示:

[
   {timestamp: ISODate("2015-11-10T11:33:41.075Z"), nominal: 25.121},
   {timestamp: ISODate("2015-11-22T11:33:41.075Z"), nominal: 25.121},
   {timestamp: ISODate("2015-11-23T11:33:41.075Z"), nominal: 26.121},
   {timestamp: ISODate("2015-12-03T11:33:41.075Z"), nominal: 30.121},
]

如何使用 mongodb 的aggregate 来计算我每个月的总交易量?

我试过了:

db.getCollection('transaction').aggregate([
  { $group: {_id: "$timestamp", total: {$sum: "$nominal"} } }
])

但它失败了,因为我使用timestamp 而不是month。我不想将month 的另一个字段添加到交易数据中。我想为 $group 管道定制一个返回月份值的函数。

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您需要一个初步的$project 阶段,在该阶段您使用$month 运算符返回“月份”。

     db.transaction.aggregate([
        { "$project": {
            "nominal": 1, 
            "month": { "$month": "$timestamp" }
        }}, 
        { "$group": {
            "_id": "$month", 
            "total": { "$sum": "$nominal" }
        }}
    ])
    

    返回:

    { "_id" : 12, "total" : 30.121 }
    { "_id" : 11, "total" : 76.363 }
    

    【讨论】:

    • 只有在数据库中只有不到 12 个月的历史记录时才会有效。正确的实现应该返回年月数据。
    • @sorin from mongodb 3.0+ 你可以使用 $dateToString 而不是 $month 并且你可以传递一个格式(参考:docs.mongodb.com/manual/reference/operator/aggregation/…
    • 或者,如果你低于 3.0,你可以破解你的方式来获得日期的串联版本。您需要 2 个项目阶段,一个用于分别格式化 $month 和 $year。然后另一个阶段使用 $concat 并连接 2 个新字段。不要忘记在年份和月份上使用 substr,因为您不能连接整数。
    【解决方案2】:

    如果您想按year-month 分组(以避免将不同年份的月份分组在一起),您可以使用$dateToString

    // { timestamp: ISODate("2015-11-10T11:33:41.075Z"), nominal: 25.121 }
    // { timestamp: ISODate("2015-11-22T11:33:41.075Z"), nominal: 25.121 }
    // { timestamp: ISODate("2015-11-23T11:33:41.075Z"), nominal: 26.121 }
    // { timestamp: ISODate("2015-12-03T11:33:41.075Z"), nominal: 30.121 }
    db.collection.aggregate([
      { $group: {
        _id: { $dateToString: { date: "$timestamp", format: "%Y-%m" } },
        total: { $sum: "$nominal" }
      }}
    ])
    // { _id: "2015-12", total: 30.121 }
    // { _id: "2015-11", total: 76.363 }
    

    【讨论】:

      猜你喜欢
      • 2017-10-24
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 2021-04-30
      相关资源
      最近更新 更多