【问题标题】:How do I calculate the average of top 20 percent of a collection in MongoDB Aggregate?如何计算 MongoDB Aggregate 中前 20% 集合的平均值?
【发布时间】:2014-12-02 16:10:42
【问题描述】:

在像books : [{ stars: 10, valid: true }, { stars: 24, valid: false }, { stars: 76, valid: true }, ...] 这样的集合中,计算平均值很简单:

db.books.aggregate([
    { $match : {
        valid: true
    }},

    { $group : {
        _id: null,
        avg: { $avg: "$stars" } // <- How calculate $avg of top 20%?
    }}
])

但是,如果我想要前 20% 的明星平均值而不是所有明星的平均值?

PS:不知道collection(valid: true) size,因为不像我的例子,我执行了很多$unwind

OBS:

> db.version()
2.4.10

【问题讨论】:

  • 前 20% 是什么意思?根据star 属性值排名前 20% 的明星,还是 valid 属性为 true 的集合中排名前 20% 的记录?

标签: mongodb mongoid mongomapper


【解决方案1】:

您需要触发两个查询来实现此目的。

获取valid属性为true的星星总数。

var bookCount = db.books.count({"valid":true});

计算需要计算平均值的前 20% 的记录数。

var limit = Math.ceil(.2*bookCount);

执行聚合操作:

  • Match 仅是那些valid 属性为true 的记录。
  • Sort 基于stars 属性值的记录,降序排列 顺序,以便顶级明星排在第一位。
  • Limit 前 20% 的记录。
  • Group他们并计算他们的平均值。

代码:

db.books.aggregate([
{$match:{"valid":true}},
{$sort:{"stars":-1}},
{$limit:limit},
{$group:{"_id":null,"avg":{$avg:"$stars"}}}
])

我做了很多 $unwind

您的示例数据和您的代码都反映了这一点。

【讨论】:

    猜你喜欢
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2023-01-09
    • 2014-08-12
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多