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接下来,我们需要编写代码来处理返回的 JSON 数据。假设我们有一个 Person 类来表示人员信息:org.mongodb mongodb-driver-sync 4.4.0
javapublic class Person { private Long id; private String name; private int age; // 省略构造方法和其他方法 // Getter 和 Setter 方法}然后,我们可以使用以下代码来查询数据并转换为 Java 对象:
javaimport 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 对象,并进行后续的处理。