mongodb:java.lang.double类不能转换为java.lang.long类

ryevplcw  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(595)

我们使用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。
这种错误是罕见的,但如果发生,它是可复制的。
原因是什么?

xtupzzrd

xtupzzrd1#

问题可能是任何指定的字段实际上都存储为 Double 而不是 Long .
正如您在 Document 同学们,在教室里 getLong 方法可以找到以下内容:

return (Long) get(key);

此强制转换导致mongo驱动程序报告的错误。
有没有可能您的一些时间戳是用javascript和nodejs创建的,也许是用mongoshell创建的?如果是这种情况,根据创建时间戳的方式,字段的值可以插入为 double 由于数字在javascript中的表示方式。
mongo shell文档表明:
默认情况下,mongo shell将所有数字都视为浮点值。
以及:
mongo shell将所有数字视为64位浮点 double 默认值。
这个问题已经记录在这里,所以在这个问题上。这是相当过时的,但它可以解释你的问题。
这篇文章,虽然也相当陈旧,与您的问题没有直接关系,但提供了一些额外的背景知识。

kknvjkwl

kknvjkwl2#

如果数据库包含特定字段的整数和浮点类型的混合,并且您希望将它们都视为 long 在java代码中,可以使用 java.lang.Number 类,像这样:

trashDoc.get("_created", Number.class).longValue()

Double , Integer ,和 Long 全部延伸 Number ,此代码将用于从任何数字字段中提取长值。请记住,如果值是double,它将丢弃double的小数部分,即。

Document d = new Document()
            .append("_created", 4.2);
    System.out.println(d.get("_created", Number.class).longValue());

将打印 4

相关问题