Разбор типа данных при агрегировании в драйвере MongoDB Java - PullRequest
0 голосов
/ 26 января 2020

Я создал почасовой интервал времени, потому что я хотел сгруппировать и выполнить некоторые вычисления (Sum, Avg, Stdv, Max, Min) моих данных час за часом. Вот мой код:

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

И моя проблема в том, что я вижу свой результат, но сумма, среднее и стандартное отклонение равны нулю или равны нулю. Я вижу только значения для мин и макс. Я предполагаю, что тип данных - это строковый тип, и он не может применять математические операции, в то время как для min и max он применим даже в виде строки. Кто-нибудь знает, как анализировать тип данных, чтобы удвоить при агрегировании?

Одна строка моего результата:

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}}

Буду благодарен, если у кого-нибудь есть подсказка.

Спасибо

1 Ответ

0 голосов
/ 29 января 2020

Нашли решение!

        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\"}"))
            )
    )

и строку результата:

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}}
...