如何在mongodb中按月对文档进行分组?

Den*_*Hiu 7 mongodb mongodb-query aggregation-framework

我在 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},
]
Run Code Online (Sandbox Code Playgroud)

我如何使用 mongodb 的聚合()来计算我每个月的总交易量?我试着用

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

它失败了,因为我使用timestamp而不是month. 我不想为month交易数据添加另一个字段。我想为 $group 管道定制一个返回月值的函数。是否可以 ?如果是这样,如何?

sty*_*ane 5

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

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

返回:

{ "_id" : 12, "total" : 30.121 }
{ "_id" : 11, "total" : 76.363 }
Run Code Online (Sandbox Code Playgroud)

  • 仅当您在数据库中的历史记录少于 12 个月时,这才有效。正确的实现应该返回年月数据。 (6认同)