MongoDB:嵌套值的聚合计算

Posted

技术标签:

【中文标题】MongoDB:嵌套值的聚合计算【英文标题】:MongoDB: Aggregation calculations on nested values 【发布时间】:2014-06-03 00:03:43 【问题描述】:

我有一个 MongoDB 集合,其中包含与用户项目相对应的文档并包含以下相关元素:


  "InstanceId": "Instance1",
  "Username": "JohnSmith",
  "ProjectTotals": 
    
      Subtotal: 100.00
      TaxTotal: 0.000
    

每个实例包含多个用户,每个用户可以拥有多个项目。

我正在尝试获取一些汇总数据,以便向实例经理显示每个用户创建的项目数量以及所有项目的总成本和每个用户的平均项目成本。

到目前为止,我已经构建了以下查询(暂时忽略税收):

db.projects.aggregate( 
$match: 
    InstanceId: "Instance1", 
     ProjectTotals:"$exists":true     ,
$group:
    _id: "$Username", 
        count:  $sum: 1 ,
        total:  $sum: "ProjectTotals.SubTotal",
        average: $avg: "ProjectTotals.SubTotal")

这个查询成功地为我提供了每个用户的计数,但每个用户的总数和平均值为 0:

"result" : [ 
    
        "_id" : "JohnSmith",
        "count" : 10,
        "total" : 0,
        "average" : 0
    
]

在不更改我的数据库架构的情况下,如何访问 ProjectTotals.SubTotal 以获取聚合函数?

【问题讨论】:

【参考方案1】:

您需要在 ProjectTotals 前面加上 $ 拼写错误的 SubTotal(它在您的架构中是 Subtotal,但在您的聚合中是 SubTotal)。进行两项更正:

db.projects.aggregate(
                      $match: InstanceId: "Instance1", ProjectTotals:"$exists":true,
                      $group: _id: "$Username", count:  $sum: 1 ,
                           total: $sum: "$ProjectTotals.Subtotal", 
                                    average: $avg: "$ProjectTotals.Subtotal"
                      )

根据我得到的示例数据运行它:

 "_id" : "JohnSmith", "count" : 1, "total" : 100, "average" : 100 

这是我对 1 的数据样本的期望。

【讨论】:

以上是关于MongoDB:嵌套值的聚合计算的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB聚合(aggregate)常用操作及示例

查询 $match 和 $project 重嵌套数据(MongoDB/聚合)

MongoDB:使用嵌套的 $group 聚合

MongoDB聚合和分组嵌套字段

MongoDB Aggregation

如何聚合 MongoDB 嵌套查询?