首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按月对文档进行分组?

如何按月对文档进行分组?
EN

Stack Overflow用户
提问于 2015-11-27 07:14:21
回答 2查看 10.2K关注 0票数 8

我在mongodb中有一组事务数据,如下所示:

代码语言:javascript
复制
[
   {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计算每个月的总事务量?

我试过:

代码语言:javascript
复制
db.getCollection('transaction').aggregate([
  { $group: {_id: "$timestamp", total: {$sum: "$nominal"} } }
])

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-27 07:27:19

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

代码语言:javascript
复制
 db.transaction.aggregate([
    { "$project": {
        "nominal": 1, 
        "month": { "$month": "$timestamp" }
    }}, 
    { "$group": {
        "_id": "$month", 
        "total": { "$sum": "$nominal" }
    }}
])

返回:

代码语言:javascript
复制
{ "_id" : 12, "total" : 30.121 }
{ "_id" : 11, "total" : 76.363 }
票数 5
EN

Stack Overflow用户

发布于 2021-12-05 09:31:47

如果您希望对每个year-month进行分组(以避免不同年份的月份分组在一起),则可以使用$dateToString

代码语言:javascript
复制
// { 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 }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33952057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档