2014-12-02 2 views
2

: books : [{ stars: 10, valid: true }, { stars: 24, valid: false }, { stars: 76, valid: true }, ...]이다 간단한 계산 평균 :MongoDB 집계에서 컬렉션의 상위 20 % 평균을 어떻게 계산합니까? 같은 모음에서

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

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

하지만, 대신 모든 별 평균의 별 상위 20 %의 평균 원한다면?

PS : 알고 모음 (유효 : TRUE)없이 크기, 내 예와는 달리, 나는 많이 수행하기 때문에 $unwind

OBS : 당신은 두 개의 질의를 해고 할 필요가

> db.version() 
2.4.10 
+0

상위 20 %를 의미합니까? 'star' 속성 값 또는 'valid' 속성이 true 인 컬렉션의 상위 20 % 레코드를 기반으로 별의 상위 20 %를 찾습니다. – BatScream

답변

1

이것을 달성하십시오.

valid 속성이 true 인 별의 총 개수를 가져옵니다.

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

평균을 계산해야하는 상위 20 %의 레코드 수를 계산합니다.

  • Match 레코드 만, 그 valid 속성 true입니다 :
    var limit = Math.ceil(.2*bookCount); 
    

    는 집계 작업을 수행합니다.
  • Sort 속성 값을 기준으로 한 레코드는 순서로 내림차순으로 표시되므로 맨 위의 별이 먼저옵니다.
  • Limit 레코드의 상위 20 %.
  • Group 그 평균을 계산하십시오.

강령 :

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

나는 $의 많은

샘플 데이터 나 코드이를 반영을 긴장 수행합니다.

관련 문제