获取字符串值的最大值

时间:2019-08-22 10:13:39

标签: java mongodb

我有一个字段“借方”以String的形式存储在数据库中,而实际上它是double / float。 我想通过以下操作获得此字段的最大值:

    DBObject query = new BasicDBObject("debit", -1);
    d= collection.find.sort(query).limit(1); // for MAX

但不幸的是,它返回的值不是真正的最大值(返回999.0而不是1432) 我尝试通过获取列表中的所有“借方”数据并获取其最大值来尝试另一种解决方案,但我遇到了这个错误

   List<Double> list = new ArrayList<>();
    while (d.hasNext()){
    if(!d.next().get("debit").toString().isEmpty()){
        list.add(Double.parseDouble(d.next().get("debit").toString()));

    }
        System.out.println(Collections.max(list));

    }

错误:

Exception in thread "main" java.lang.NumberFormatException: empty String

通常我不会收到此错误,因为我将if设为空值。

我除了要获取存储为String的字段的最大值。 有人可以向我提出一个想法或解决我的错误

2 个答案:

答案 0 :(得分:1)

您两次获得下一个元素。因此,在第一次调用之后,您将在Double.parseDouble()-Method中获得第一个元素(在if语句中)和第二个元素。  因此,您应该将代码更改为:

List<Double> list = new ArrayList<>();
    while (d.hasNext()){
    String string = d.next().get("debit").toString();
    if(!string.isEmpty()){
       try{
        list.add(Double.parseDouble(string));
        } catch (NumberFormatException e) {
           e.printStackTrace(); //prints error
      }
    }
        System.out.println(Collections.max(list));

    }

答案 1 :(得分:0)

一种最佳方法是在查询本身中完成所有处理工作。以下查询可以为我们提供预期的输出:

db.collection.aggregate([
    {
        $group:{
            "_id":null,
            "max":{
                $max:{
                    $toDouble: { 
                        $cond:[
                            {
                                $in:["$debit",["",null]]
                            },
                            "0",
                            "$debit"
                        ]
                    }
                }
            }
        }
    },
    {
        $project:{
            "_id":0
        }
    }
]).pretty()

数据集:

{ "_id" : ObjectId("5d619fadf00e0c8c3593b603"), "debit" : "999.0" }
{ "_id" : ObjectId("5d619fadf00e0c8c3593b604"), "debit" : "1432" }
{ "_id" : ObjectId("5d61a0daf00e0c8c3593b605"), "debit" : "997.0" }
{ "_id" : ObjectId("5d61a0daf00e0c8c3593b606"), "debit" : "" }

输出:

{ "max" : 1432 }

我们正在将debit转换为Double,并根据转换后的值计算max。如果借项是emptynull,则转换代码会将其设为0。