MongoDB 聚合框架计算平均文档

4

我有一个问题:每个个人资料可以有很多问题。

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

使用MongoDB的新聚合框架,如何计算每个配置文件的平均问题数量?尝试以下操作但未成功:
{ "aggregate" : "question" , "pipeline" : [ { "$group" : { "_id" : "$pid" , "qCount" : { "$sum"    : 1}}} , { "$group" : { "qavg" : { "$avg" : "qCount"} , "_id" :  null }}]}

能否只用一个分组运算符来完成这项任务?
谢谢。
1个回答

12

要实现这个功能,您只需要知道问题的数量和不同配置文件的数量(唯一地用“pid”标识)。通过聚合框架,您需要分两个阶段完成此操作:

  • 首先,计算每个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,如下面的第二组所示:

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

然后这个输出:

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

这告诉我,平均每个档案有4个问题。


在最终的 $group 中使用 null 作为 _id 值从未发生在我的脑海中。 - Matthew Nichols

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接