java - MongoDb Java 驱动 toJson() 和 $oid
问题描述
我正在构建一个使用 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);
推荐阅读
- python - 在 Python 中从多个图像中绘制 3D 数据
- sql - 在同一日期结构中显示具有不同时间线的两个字段
- python - Python Selenium 根据坐标获取单元格值
- java - 如何在 Java Tomcat (Liferay) 中为 SMTP、外部 JSON API 和 MySQL JDBC 配置不同的 SSL 配置的不同接口/上下文?
- css - 选择兄弟姐妹和该兄弟姐妹的所有嵌套特定类型的元素
- python - CHEMBL:无法从 chembl_webresource_client.new_client 导入 new_client
- java - 如何解决由于某种原因导致执行失败?
- maven - 如何在 Maven 3.8 上将我的私人关系列入白名单?
- c# - 从长字符串中查找匹配的字符串,C#
- python - Django,makemigrations 不检测模型更改