java - MongoDb Java 驱动程序 toJson() 和 $oid

标签 java mongodb mongodb-java objectid

我正在构建一个使用 MongoDb 和 MongoDb 驱动程序的 Java Jersey API。

资源应输出存储的 MongoDb 文档的 JSON,以便在使用 Svelte 的前端项目中使用。

由于标准的 org.bson.Document.toJson() 实现,我的文档的输出看起来像:

[{ "_id" : { "$oid" : "5e97f08f2175aa9174dbec0e" }, "hour" : 8, "minute" : 15, "enabled" : true, "duration" : 120 }

我更希望它是:

[{ "_id" : "5e97f08f2175aa9174dbec0e", "hour" : 8, "minute" : 15, "enabled" : true, "duration" : 120 }

这样在前端处理 id 就更容易了。那么如何摆脱 $oid 对象呢?

我已经成功地通过使用以下方式获得了我想要的格式:

JsonWriterSettings settings = JsonWriterSettings.builder()
                .outputMode(JsonMode.RELAXED)
                .objectIdConverter((value, writer) -> writer.writeString(value.toHexString()))
                .build();
        System.out.println(doc.toJson(settings));

但是如何全局注册这个设置对象以便每个 doc.toJson() 调用都会使用它?

如果我将修改后的或新的文档从前端发送到 API 并执行以下操作,会发生什么:

Document document = Document.parse(doc);

我修改后的 _id 字段是否会再次自动转换为 ObjectId?或者我需要 org.bson.codecs.Decoder 或 CodecRegistry 吗?这将如何完成?

最佳答案

$oid 引用 bson spec 中的 ObjectId 字段类型。据我所知,您需要操作文档以将 _id 的 ObjectId 替换为 String。

String oidAsString = document.getObjectId("_id").toString();
document.put("_id", oidAsString);

关于java - MongoDb Java 驱动程序 toJson() 和 $oid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61264946/

相关文章:

java - 如何找到时间之间的差异

java - Hibernate 一对多到 JSON 给出 : 500 internal server error

JavaFX 不会在 Mac 上的 BlueJ 中导入

node.js - sails js 中的组合搜索

mongodb - mongo 未连接但已安装并显示版本

java - 如何使用 java 仅获取 mongodb 中文档的 objectId

java - 多个 if then else 在监听器类上

java - setMinimumFractionDigits(..) 详细信息。数字格式类

node.js - 带有 $project 的 mongodb 聚合有条件地排除一个字段

java - 如何让 MongoCollectoin 返回 java.sql.Timestamp?