Агрегация и группировка блоков в драйвере MongoDB Java - PullRequest
0 голосов
/ 31 января 2020

Я делаю короткий запрос, чтобы получить некоторые данные из MongoDB, используя MongoDB Java Driver v 3.2. Я использую Bucket and Unwind агрегат , чтобы сделать мою работу и результат немного значимыми. Я создал фильтр на основе указанного c поля идентификатора ( IdManf c) и указанного c поля сигнала ( mysignal ). Я стремлюсь получить результат, используя агрегацию сегментов для группировки моих данных по некоторым границам (часовая метка времени). Я хочу показать id и сигнал в своем результате, и именно поэтому я использовал традиционный SQL трюк ( min (id) , потому что я отфильтровал только один идентификатор) и ( min (сигнал) , поскольку я отфильтровал только один сигнал), чтобы включить в результат мои id и сигнал . Теперь я хочу немного изменить свою теорию, хочу представить, что у меня есть только один идентификатор , но много сигналов , и я хочу включить их в свой результат таким образом, чтобы идентификатор один, но информация для каждого сигнала отличается. Или что, если у меня много идентификаторов и много сигналов, и я хочу включить их в свой результат. Кто-нибудь имеет какие-либо идеи?

Какой-то намек на то, что id и сигнал означает в моем коде, id относится к машине на заводе, а сигнал означает тип работа, которую делает машина. Допустим, на заводе компьютер имеет идентификатор 12345 и выполняет 3 вида работ, которые идентифицируются сигналами, один сигнал печать (имя сигнала X) , второй сигнал сканирование ( Y) , третий сигнал не работает (Z) . Теперь я хочу создать блок с указанием идентификатора машины (12345) и его типа работы, группируя час за часом и вычисляя минимальное и максимальное время, потраченное (что является значением) для каждого сигнала.

    Bson startTimeBucket = match( gte("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\"}"))
            )
    );

    List<Document> resultbuckt = coll.aggregate(asList(startTimeBucket,
                                                        endTimeBucket,
                                                        idFilterBucket,
                                                        unwindBucket,
                                                        filterSignalUnBucket,
                                                        Bucket
                                                )).into(new ArrayList<Document>());
    for (Document Document : resultbuckt) {
        System.out.println(Document);

Мои данные в базе данных: введите описание изображения здесь

Соответствующий JSON:

{"_id":{"$oid":"5db06b6880bd68ca32a853bc"},"disconnected":false,"id":"144-12","lastTimestamp":{"$numberLong":"1571842909626"},"manufacturer":"gmb","modelName":"GMB_Mod1","signals":[{"event":"changed","signal":"InterfaceType.Moulds.Mould_1.TemperatureZones.TemperatureZone_4.ActualTemperature","stability":"unstable","timestamp":{"$numberLong":"1571842907576"},"type":"DOUBLE","value":"175.0","writable":"read","written":false},{"event":"changed","signal":"InterfaceType.InjectionUnits.InjectionUnit_1.TemperatureZones.TemperatureZone_3.ActualTemperature","stability":"unstable","timestamp":{"$numberLong":"1571842907576"},"type":"DOUBLE","value":"35.0","writable":"read","written":false}],"tC":{"$numberInt":"10"}}
{"_id":{"$oid":"5db069c480bd68ca32a841ec"},"disconnected":false,"id":"144-12","lastTimestamp":{"$numberLong":"1571842499744"},"manufacturer":"gmb","modelName":"GMB_Mod1","signals":[{"event":"changed","signal":"InterfaceType.InjectionUnits.InjectionUnit_1.TemperatureZones.TemperatureZone_1.ActualTemperature","stability":"unstable","timestamp":{"$numberLong":"1571842496543"},"type":"DOUBLE","value":"65.0","writable":"read","written":false}],"tC":{"$numberInt":"10"}}

2 строки моего результата, который является тем же сигналом и другое время (потому что я группирую результат, используя интервалы времени и сегмента:

Document{{_id=1574434800859, id=144-12, signal=signal 1, Average=69.86274509803921, STD=1.2003267528991806, Max=71.0, Min=68.0}}
Document{{_id=1578444800859, id=144-12, signal=signal 1, Average=69.86274509803921, STD=1.2003267528991806, Max=72.0, Min=69.0}}

В своем коде я специально отфильтровал один сигнал, а затем, чтобы увидеть его в своем результате, я использую мин (сигнал). Что я ожидаю видеть из результата нечто похожее на то, что я уже получил, но я хотел бы иметь также результаты для других сигналов в пределах этих временных границ ("_ id") и удалить фильтр только для одного сигнала, я ожидаю что-то вроде ниже:

Document{{_id=1574434800859, id=144-12, signal=**the name of 1st signal**, Average=69.86274509803921, STD=1.20035267528991806, Max=80.0, Min=68.0}}
Document{{_id=1574434800859, id=144-12, signal=**the name 2nd signal**, Average=69.86274509803921, STD=12.2003267528991806, Max=95.0, Min=68.0}}
Document{{_id=1574434800859, id=144-12, signal=**the name of 3rd signal**, Average=69.86274509803921, STD=0.2003267528991806, Max=85.0, Min=68.0}}

У кого-нибудь есть идеи?

Спасибо

...