2011-06-20 8 views
6

Powiedzmy mam zestaw danych jak poniżej:Najszybszy sposób, aby uzyskać średnią danej dziedzinie w MongoDB

{ "_id" : ObjectId("4dd51c0a3f42cc01ab0e6506"), "views" : 1000, "status" : 1 } 
{ "_id" : ObjectId("4dd51c0e3f42cc01ab0e6507"), "views" : 2000, "status" : 1 } 
{ "_id" : ObjectId("4dd51c113f42cc01ab0e6508"), "views" : 3000, "status" : 1 } 
{ "_id" : ObjectId("4dd51c113f42cc01ab0e6508"), "views" : 4000, "status" : 0 } 

Jaki jest najszybszy sposób (performance-wise), aby uzyskać średnią liczbę widoków wszystkie dokumenty o statusie 1? Czy wymagana jest opcja Map/Reduce w przypadku czegoś takiego podstawowego, czy istnieje inny sposób?

Odpowiedz

7

Zastosowanie Grupa: http://www.mongodb.org/display/DOCS/Aggregation

trzeba licznik dokumentów, a drugi do sumy poglądów. W finalizacji wystarczy podział na te dwie liczby.

db.test.group(
    { cond: {"status": 1} 
    , initial: {count: 0, total:0} 
    , reduce: function(doc, out){ out.count++; out.total += doc.views } 
    , finalize: function(out){ out.avg = out.total/out.count } 
}); 
5

Szybszy sposób, aby uzyskać średnio w każdym przypadku - precalculate go (prawdopodobnie można to zrobić w tle) i utworzyć dodatkowe pole/kolekcji, aby ją zachować.

+2

Zastanawiasz się, dlaczego minus? Co jest nie tak z moją odpowiedzią? –

Powiązane problemy