2014-12-02 133 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"}}} 
]) 

我進行了大量的$放鬆

您的樣本數據,也沒有你的代碼反映這一點。