我们使用mongodb,得到了以下错误:
class java.lang.Double cannot be cast to class java.lang.Long (java.lang.Double and java.lang.Long are in module java.base of loader ‘bootstrap’)
堆栈跟踪:
{
"file": "Document.java",
"method": "getLong",
"line": 266,
"exact": false,
"location": "bson-3.11.0.jar",
"class": "org.bson.Document",
"version": "?"
},
{
"file": "Util.kt",
"method": "determineLastChanged",
"line": 11,
"exact": false,
"location": "foobar-backend-persist-2020.47.5.jar",
"class": "com.foobar.persist.trash.UtilKt",
"version": "?"
},
我们的代码:
// com.foobar.persist.trash.UtilKt
import org.bson.Document
internal fun determineLastChanged(trashDoc: Document): Long {
return trashDoc.getLong("_touched")
?: trashDoc.getLong("_created")
?: trashDoc.getDocument("_trash")?.getLong("deletedAt")
?: throw InternalTrashException("trash item without timestamp")
}
我懂java,但我对mongodb还不熟悉。我以前用过sql。
这种错误是罕见的,但如果发生,它是可复制的。
原因是什么?
2条答案
按热度按时间xtupzzrd1#
问题可能是任何指定的字段实际上都存储为
Double
而不是Long
.正如您在
Document
同学们,在教室里getLong
方法可以找到以下内容:此强制转换导致mongo驱动程序报告的错误。
有没有可能您的一些时间戳是用javascript和nodejs创建的,也许是用mongoshell创建的?如果是这种情况,根据创建时间戳的方式,字段的值可以插入为
double
由于数字在javascript中的表示方式。mongo shell文档表明:
默认情况下,mongo shell将所有数字都视为浮点值。
以及:
mongo shell将所有数字视为64位浮点
double
默认值。这个问题已经记录在这里,所以在这个问题上。这是相当过时的,但它可以解释你的问题。
这篇文章,虽然也相当陈旧,与您的问题没有直接关系,但提供了一些额外的背景知识。
kknvjkwl2#
如果数据库包含特定字段的整数和浮点类型的混合,并且您希望将它们都视为
long
在java代码中,可以使用java.lang.Number
类,像这样:自
Double
,Integer
,和Long
全部延伸Number
,此代码将用于从任何数字字段中提取长值。请记住,如果值是double,它将丢弃double的小数部分,即。将打印
4