java - 在 MongoDB Java 驱动程序中聚合时解析数据类型

标签 java mongodb mongodb-java mongo-java-driver

我创建了一个每小时的时间段,因为我想对我的数据进行分组并每小时进行一些计算(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);
    }

我的问题是我看到了结果,但总和、平均值和标准差为零或为空。我只看到最小值和最大值。我猜测是因为数据类型是字符串类型,它不能应用数学运算,而对于最小值和最大值,它甚至可以作为字符串应用。有谁知道如何在聚合时将数据类型解析为双倍?

我的结果的一行:

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

如果有人有任何提示,我将不胜感激。

谢谢

最佳答案

找到解决方案!

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

关于java - 在 MongoDB Java 驱动程序中聚合时解析数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59917799/

相关文章:

java - 使用没有迭代器的 Java 复制集合 Mongodb 以进行数据库管理员登录

java - Morphia在MongoDB中插入多个嵌入数据

java - 如何使用 HSSF 从 Excel 单元格读取字母数字数据?

javascript - 在聚合调用中限制字段属性的更好方法

javascript - 在 Mongo 中获取数据而不是 URI 的替代方法

mongodb - 使用 mgo 存储嵌套结构

mongodb - Spring-Data mongodb查询存储在同一个集合中的多个类

java - StAX Cursor API 和 Iterator API 有什么区别?

Java 的类加载器与 jars-within-jars

java - 什么时候应该使用封装?