Mongodb聚合框架计算avg文​​档

时间:2013-07-13 16:37:44

标签: mongodb aggregation-framework

我有问题收集每个个人资料可以有很多问题。

{"_id":"..." , "pid":"...",.....}

使用mongo DB新聚合框架如何计算每个配置文件的平均问题数量?

尝试了以下但没有成功:

{ "aggregate" : "question" , "pipeline" : [ { "$group" : { "_id" : "$pid" , "qCount" : { "$sum"    : 1}}} , { "$group" : { "qavg" : { "$avg" : "qCount"} , "_id" :  null }}]}

只能使用一个群组操作员吗?

感谢。

1 个答案:

答案 0 :(得分:11)

为此,您只需要知道问题的数量,以及不同配置文件的数量(使用" pid&#34唯一标识;我假设)。使用聚合框架,您需要分两个阶段完成:

  • 首先,计算每个PID的问题数
  • 然后计算每个PID的平均问题

你这样做:

第一步:

db.profiler.aggregate( [
    { $group: { _id: '$pid', count: { '$sum': 1 } } },
] );

哪些输出(在我的情况下,包含一些示例数据):

{
    "result" : [
        { "_id" : 2, "count" : 7 },
        { "_id" : 1, "count" : 1 },
        { "_id" : 3, "count" : 3 },
        { "_id" : 4, "count" : 5 }
    ],
    "ok" : 1
}

我有四个配置文件,分别有7个,1个,3个或5个问题。

现在有了这个结果,我们运行了另一个组,但在这种情况下,我们并不想真正地按任何组进行分组,因此我们需要将_id值设置为 null < / strong>正如您在下面第二组中看到的那样:

db.profiler.aggregate( [
    { $group: { _id: '$pid', count: { '$sum': 1 } } },
    { $group: { _id: null, avg: { $avg: '$count' } } }
] );

然后输出:

{
    "result" : [
        { "_id" : null, "avg" : 4 }
    ], 
    "ok" : 1
}

这告诉我平均每个配置文件有4个问题。