我正在构建一个使用 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/