我有一个简单的 POJO,其中有一个长字段,实际上是一个时间戳。
此字段必须在由 ISODate 表示的 mongo 数据库中。
我可以为整个 Pojo 编写一个转换器,但由于它只是 25 个字段中的一个,这没有多大意义,并且当一个字段发生变化或添加一个字段时,它是另一个错误的地方。
有没有办法调用默认转换器服务并在默认转换服务之后更改另外两个,这将对性能产生很大影响。 还是有一个默认的 Converter 接口(interface)可以覆盖?
这里的最佳做法是什么?
也许我可以将注释应用于此字段?
是的,我也可以编写一个 LongToDate 转换器,但这会影响所有 POJO,而不仅仅是单个 POJO。
这里是示例 POJO:
public class Person {
private long someTimestamp;
//getters and setters
}
如果没有转换器,这将如下所示:
{
"_id" : ObjectId("52ae8eede4b0249cde22059e"),
"someTimestamp" : NumberLong(1392714950940)
}
结果应该是这样的:
{
"_id" : ObjectId("52ae8eede4b0249cde22059e"),
"someTimestamp" : ISODate("2013-12-23T23:00:00.000Z")
}
例如,当这样的时间戳值在嵌套文档中时,所描述的问题会变得更加复杂:
{
"_id" : ObjectId("52ae8eede4b0249cde22059e"),
"items" : [
"someTimestamp" : NumberLong(1392714950940)
]
}
POJO:
public class Person {
private Collection<OtherPojoThatHoldsTimestamps> items;
//getters and setters
}
也许我应该提到我正在使用 Spring 来完成此任务。 (http://projects.spring.io/spring-data-mongodb/)
最佳答案
听起来您需要注释驱动的转换。 reference manual 中的第 6.6.2 节为格式化程序讨论这个问题,甚至还有一个带有时间戳的例子。
一般的想法是,您将使用注释标记需要特殊处理的字段(这是对注释的良好使用,毕竟您是在指定元数据)。然后为具有该注释的字段注册一个转换器。
问题是我刚刚尝试过,但无法让它工作,因为元数据丢失了。我已经提交了 JIRA ticket看看有没有办法解决这个问题。
https://stackoverflow.com/questions/21849590/
相关文章:
java - Spring数据mongodb审计不起作用..(Java配置)
mongodb - 为什么 MongoDB 可以创建唯一索引而 Mongoid 不能?
php - 如何在 Waterline 或 MongoDB 中选择、分组和加入
python - Pymongo 或 Mongodb 将两个相等的 python 字典视为不同的对象
node.js - 在 docker 容器中安装 Mongoose
mongodb - 如何将 MongoDB 聚合用于通用集合操作(联合、交集、差异)