Reputation: 11
I have created an hourly time bucket because I wanted to group and do some calculations (Sum, Avg, Stdv, Max, Min) my data hour by hour. Here is my code:
Bson startTimeBucket = match( gt("lastTimestamp",startTime));
Bson endTimeBucket= match(lte("lastTimestamp",finishTime));
Bson idFilterBucket = match(eq("id", IdManfc));
Bson unwindBucket = unwind("$signals");
Bson filterSignalUnBucket = match(eq("signals.signal",
mysignal));
Bson Bucket=bucket("$lastTimestamp", timeBucketList, new BucketOptions()
.defaultBucket("sum")
.output( min("id","$id"),
min("signal","$signals.signal"),
sum("Summation","$signals.value"),
avg("Average","$signals.value"),
stdDevSamp("STD","$signals.value"),
max("Max","$signals.value"),
min("Min","$signals.value")
)
);
List<Document> resultbuckt = coll.aggregate(asList(startTimeBucket,
endTimeBucket,
idFilterBucket,
unwindBucket,
filterSignalUnBucket,
Bucket
)).into(new ArrayList<Document>());
for (Document Document : resultbuckt) {
System.out.println(Document);
}
And my problem is I see my result but Sum and Avg and Standard Deviation are zero or null. I see only values for min and max. what I am guessing is because the data type is a string type and it can not apply math operation while for min and max it is applicable even as a string. Does anyone have any idea how to parse the data type to double while aggregating?
One line of my result:
Document{{_id=1574431200859, id=144-12, signal=InterfaceType.InjectionUnits.InjectionUnit_1.TemperatureZones.TemperatureZone_1.ActualTemperature, Summation=0, Average=null, STD=null, Max=72.0, Min=68.0}}
I would be thankful if anyone has any hint.
Thanks
Upvotes: 0
Views: 222
Reputation: 11
Found the solution!
Bson startTimeBucket = match( gt("lastTimestamp",startTime));
Bson endTimeBucket= match(lte("lastTimestamp",finishTime));
Bson idFilterBucket = match(eq("id", IdManfc));
Bson unwindBucket = unwind("$signals");
Bson filterSignalUnBucket = match(eq("signals.signal", mysignal));
Bson Bucket=bucket("$lastTimestamp", timeBucketList, new BucketOptions()
.defaultBucket("sum")
.output(min("id","$id"),
min("signal","$signals.signal"),
avg("Average",Document.parse("{$toDouble: \"$signals.value\"}")),
stdDevSamp("STD",Document.parse("{$toDouble: \"$signals.value\"}")),
max("Max",Document.parse("{$toDouble: \"$signals.value\"}")),
min("Min",Document.parse("{$toDouble: \"$signals.value\"}"))
)
)
and a line of the result:
Document{{_id=1574431200859, id=144-12, signal=InterfaceType.InjectionUnits.InjectionUnit_1.TemperatureZones.TemperatureZone_1.ActualTemperature, Average=69.98214285714286, STD=1.243032529795528, Max=72.0, Min=68.0}}
Upvotes: 1