2014-04-27 3 views
8

Próbuję uzyskać średnią z całego pola przy użyciu frameworka agregacji w Mongo. Jednak nie mogę znaleźć żadnego przykładu, który używa go bez parametru grupy.Zapytanie o średnią agregację Mongo bez grupy

Mam następującą strukturę dokumentu:

{ 
     "_id" : ObjectId("5352703b61d2739b2ea44e4d"), 
     "Semana" : "2014-02-23 - 2014-03-01", 
     "bolsaDeValores" : "7", 
     "bvc" : "8", 
     "dollar" : "76", 
     "ecopetrol" : "51", 
     "dollarPrice" : "18" 
} 

Zasadniczo co chcę zrobić, to uzyskać średnią wartość pola BVC i wszelkie inne jeden numeryczną dla całej kolekcji w najszybszy możliwy sposób (bez użycia MapReduce, ponieważ jest mniej wydajny niż Framework Aggregation).

Próbowałem grupy w oparciu o większą od zera, jak dobrze, ale bezskutecznie:

db.EvaluatedSentiments.aggregate([ 
    { "$group": { 
     "bvc" : {"$gt:0"} 
     }, 
     { 
      "bvc" : { "$avg" : "$bvc"} 
     } 
    } 
]) 

Doceniam jakiejkolwiek pomocy można dostarczyć.

Referencje: Mongo aggregation manual

+0

Grupuj według null zamiast – Sammaye

+0

Czy rzeczywiście zdajesz sobie sprawę, że żadna z wartości, które przedstawiłeś, nie jest w rzeczywistości numeryczna, nieprawdaż? W rzeczywistości są to wszystkie struny. –

+0

To prawda, nie zdawałem sobie z tego sprawy, zaniedbania dokonałem podczas przechowywania vales. Dzięki – NicolasZ

Odpowiedz

28

Przede wszystkim przechowywać wartości liczbowe jako liczb. Następnie można użyć prostego oświadczenia obliczyć średnią:

db.collection.aggregate({ 
    "$group": { 
    "_id": null, 
    "avg_bvc": { "$avg": "$bvc" } 
    } 
}) 

można po prostu użyć bardziej $avg operatorów agregacji, aby uzyskać średnie dla innych pól numerycznych:

db.collection.aggregate({ 
    "$group": { 
    "_id": null, 
    "avg_bvc": { "$avg": "$bvc" }, 
    "avg_dollar": { "$avg": "$dollar" } 
    } 
}) 
+0

Dzięki, dokładnie to, czego potrzebowałem. – NicolasZ

+2

prawie przegapił "_id": null. to pogrupuje wszystko w jednym! geniusz! – Kay

2

Więc jeśli dane rzeczywiście był numeryczny co nie jest, a twoim zamiarem jest wyłączenie dokumentów, które mają wartość "większą niż zero", wtedy dołączasz instrukcję $match do potoków agregacji w celu "odfiltrowania" tych dokumentów:

db.EvaluatedSentiments.aggregate([ 
    { "$match": { 
     "bvc": { "$gt": 0 } 
    }}, 
    { "$group": { 
     "_id": null, 
     "bvc": { "$avg": "$bvc" } 
    }} 
]) 
+0

Dziękuję bardzo Neil. – NicolasZ

+0

Chcę wyświetlić wartość 0 na liście, ale w avg muszę wykluczyć zero. W tej sytuacji powyższe nie działa. Czy istnieje możliwość jej uzyskania – user3211705