Próbuję obliczyć średnią wartość z kolekcji za pomocą sterownika MongoDB java, jak poniżej:jak obliczyć średnią z MongoDB i NumberLong
DBObject condition =
new BasicDBObject("pluginIdentifier", plugin.getIdentifier());
DBObject initial = new BasicDBObject();
initial.put("count", 0);
initial.put("totalDuration", 0);
String reduce = "function(duration, out) { out.count++;
out.totalDuration+=duration.floatApprox; }";
String finalize = "function(out) { out.avg = out.totalDuration.floatApprox/
out.count; }";
DBObject avg = durationEntries.group(
new BasicDBObject("pluginIdentifier", true),
condition, initial, reduce, finalize);
System.out.println(avg);
„czas” jest NumberLong (w java go, jest długi, prawdopodobnie sterownik java konwertuje go). zorientowali się, że po poszukiwaniach w celu wydobycia numer, używając .floatApprox była jedna droga, i to działa również w konsoli MongoDB:
> db.DurationEntries.findOne().duration.floatApprox
5
jednak uruchomić powyższy kod Java nie będzie obliczyć średnią, ale wraca to zamiast
[{"pluginIdentifier":"dummy", "count":7.0, "totalDuration":NaN, "avg":NaN}]
próbowałem kilka odmian, z lub bez .floatApprox, ale tylko w stanie uzyskać kilka dziwnych powiązań, ciąg aż do teraz.
Moje pytanie brzmi: co robię źle/w jaki sposób powinienem obliczyć średnią jednej kolumny NumberLong?
Czy kluczem jest tutaj, aby mongo robić uśrednianie, zamiast ciągnąć dane kolumn do Java? Czy na pewno przypadkowo nie masz żadnych danych liczbowych w okresie ważności? –
Tak, to jest mój zamiar, aby wykonać obliczenia w bazie danych, a nie w pamięci (ponieważ, gdy będę miał wiele wpisów, myślę, że moja JVM zabraknie pamięci). I rzeczywiście, mogą istnieć dane nieliczbowe, o ile mogą być "puste" średnie wpisy - sprawdzę, czy to jest –
Jeśli wszystko, co chcesz, jest średnią, to nie powinno to zabrać dużej ilości pamięci, jak sądzę, ponieważ nie trzeba przechowywać każdego wpisu w pamięci, tylko sumę całkowitą i liczbę. Nie jestem wystarczająco zaznajomiony z Mongo, aby powiedzieć dokładnie, jak to zrobić, ale jeśli możesz wsadowy zestaw wyników z zapytania, możesz przetworzyć podzbiór na raz. –