我有一个字段“借方”以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的字段的最大值。 有人可以向我提出一个想法或解决我的错误
答案 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
。如果借项是empty
或null
,则转换代码会将其设为0。