MongoDB 在转换回 Java 对象时出现“NumberLong$numberLong”问题

作者:编程家 分类: mongodb 时间:2025-07-30

MongoDB 是一个非关系型数据库,它以 JSON 格式存储数据。在使用 MongoDB 时,我们经常需要将数据库中的数据转换为 Java 对象进行处理。然而,在这个过程中,有时会遇到一个问题,即 MongoDB 返回的数据中包含了“NumberLong/$numberLong”这样的字符串。本文将介绍这个问题的原因,并提供解决方案。

问题描述

在使用 MongoDB 查询数据并转换为 Java 对象时,有时会遇到这样的情况:返回的 JSON 数据中包含了特殊的键值对,如下所示:

{

"_id": {

"$numberLong": "1234567890"

},

"name": "John",

"age": 25

}

可以看到,"_id" 字段的值被包装在了一个特殊的键值对中,键是"$numberLong",值是字符串形式的数字。这就是我们所说的“NumberLong/$numberLong”问题。

问题原因

这个问题的出现是因为 MongoDB 默认将长整型(Long)数据存储为 BSON(Binary JSON) 数据类型,而在传输过程中将其转换为了 JSON 格式。为了保持数据类型的一致性,MongoDB 会将长整型数据包装在一个特殊的键值对中。这个过程在 Java 驱动程序中是自动进行的,并且将长整型数据转换为字符串形式。

解决方案

要解决这个问题,我们需要对转换过程进行一些处理,将字符串形式的数字转换为长整型。Java 驱动程序提供了一个解决方案,即使用 BSON 类型来处理这种情况。

首先,我们需要使用 MongoDB 的 Java 驱动程序,可以在 Maven 项目中添加以下依赖:

xml

org.mongodb

mongodb-driver-sync

4.4.0

接下来,我们需要编写代码来处理返回的 JSON 数据。假设我们有一个 Person 类来表示人员信息:

java

public class Person {

private Long id;

private String name;

private int age;

// 省略构造方法和其他方法

// Getter 和 Setter 方法

}

然后,我们可以使用以下代码来查询数据并转换为 Java 对象:

java

import com.mongodb.client.MongoClients;

import com.mongodb.client.MongoCollection;

import com.mongodb.client.MongoCursor;

import org.bson.Document;

public class Main {

public static void main(String[] args) {

// 连接到 MongoDB

try (var client = MongoClients.create("mongodb://localhost:27017")) {

// 选择数据库和集合

var database = client.getDatabase("mydb");

var collection = database.getCollection("persons");

// 查询数据

try (var cursor = collection.find().iterator()) {

// 遍历结果集

while (cursor.hasNext()) {

// 获取文档对象

var document = cursor.next();

// 将文档对象转换为 Person 对象

var person = new Person();

person.setId(document.getLong("_id"));

person.setName(document.getString("name"));

person.setAge(document.getInteger("age"));

// 打印结果

System.out.println(person);

}

}

}

}

}

在上述代码中,我们使用了 MongoDB 的 Java 驱动程序来连接数据库,并选择了特定的数据库和集合。然后,我们使用了 `find()` 方法来查询数据,并获得一个游标(cursor)。接下来,我们遍历游标,将每个文档转换为 Person 对象,并打印结果。

通过使用 BSON 类型和 Java 驱动程序提供的方法,我们成功地解决了 MongoDB 转换回 Java 对象时出现的“NumberLong/$numberLong”问题。

在使用 MongoDB 查询数据并转换为 Java 对象时,我们有时会遇到“NumberLong/$numberLong”问题。这是因为 MongoDB 将长整型数据存储为 BSON 类型,并在传输过程中将其转换为 JSON 格式。为了解决这个问题,我们可以使用 MongoDB 的 Java 驱动程序,结合 BSON 类型和提供的方法,将字符串形式的数字转换为长整型。这样,我们就能够正确地将 MongoDB 返回的数据转换为 Java 对象,并进行后续的处理。