【问题标题】:MongoDB: Aggregation calculations on nested valuesMongoDB:嵌套值的聚合计算
【发布时间】: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 以获取聚合函数?

【问题讨论】:

    标签: sql mongodb mongodb-query aggregation-framework


    【解决方案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 的数据样本的期望。

    【讨论】:

      猜你喜欢
      • 2019-07-20
      • 2015-03-10
      • 2021-03-13
      • 1970-01-01
      • 2017-07-26
      • 2017-07-16
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      相关资源
      最近更新 更多