2014-12-02 172 views
2

在这样一个集合:books : [{ stars: 10, valid: true }, { stars: 24, valid: false }, { stars: 76, valid: true }, ...],简单计算平均有:如何计算MongoDB Aggregate中集合的前20%的平均值?

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

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

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

PS:没有专门收集(有效期:真)的大小,因为不像我的榜样,我进行了很多$unwind

OBS:

> db.version() 
2.4.10 
+0

前20%是指?前20%的明星是基于他们的“星级”属性值,或者是“有效”属性为真的集合中前20%的记录? – BatScream 2014-12-02 18:22:59

回答

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"}}} 
]) 

我进行了大量的$放松

您的样本数据,也没有你的代码反映这一点。