MongoDB:嵌套值的聚合计算

时间:2014-06-03 00:03:44

标签: sql mongodb mongodb-query aggregation-framework

我有一个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 个答案:

答案 0 :(得分:2)

你需要在ProjectTotals前加上$加上拼写错误的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的数据样本中得到什么。