Mos
Mos

Reputation: 11

Parsing data type while aggregation in MongoDB Java Driver

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

Answers (1)

Mos
Mos

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

Related Questions