wie die Berechnung des Durchschnitts mit mongodb und NumberLong

Ich versuche, berechnen einen Mittelwert, der aus einer Sammlung über den mongodb-java-Treiber, wie hier:

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);

"Dauer" ist ein NumberLong (in java, es ist eine Lange, wahrscheinlich die java-Treiber-konvertiert).
Ich fand nach etwas suchen, dass, um zu extrahieren, die Anzahl, mit .floatApprox war, einen Weg zu gehen, und das funktioniert auch in die mongodb-Konsole:

> db.DurationEntries.findOne().duration.floatApprox
5

Jedoch mit den obigen java-code nicht berechnen Durchschnitt, gibt aber statt

[{"pluginIdentifier":"dummy", "count":7.0, "totalDuration":NaN, "avg":NaN}]

Ich habe versucht, verschiedene Variationen, mit und ohne .floatApprox, aber nur in der Lage gewesen, um einige seltsame string-Verkettungen, bis jetzt.

Meine Frage ist: was mache ich falsch /wie gehe ich bei der Berechnung der durchschnittlichen von einem NumberLong Spalte?

  • Ist der Schlüssel hier, dass Sie wollen mongo tun die Mittelung anstatt ziehen der Spalte Daten in Java? Sind Sie sicher, dass Sie nicht versehentlich alle nicht-numerischen Daten zwischen Ihren Laufzeiten?
  • Ja, das ist meine Absicht, zu tun, die Berechnung in die Datenbank, anstatt im Speicher (weil wenn ich ' ll haben eine Menge Einträge, ich denke, dass meine JVM ausgeführt wird out-of-memory). Und ja, in der Tat kann es nicht-numerische Daten, soweit könnte es sein, "null" Durchschnitt Einträge - ich werde schauen, dass
  • Wenn alles, was Sie wollen, ist ein Durchschnitt, dann sollte es nicht nehmen große Mengen an Speicher, ich glaube, da brauchen Sie nicht zu halten, jeder Eintrag im Speicher, nur eine Summe und eine Zählung. Ich bin nicht vertraut genug mit Mongo zu sagen genau wie, aber wenn Sie können batch-das Ergebnis der Abfrage dann könnte Ihnen der Prozess einer Teilmenge zu einer Zeit.
Schreibe einen Kommentar