虽然与Convert DBObject to a POJO using MongoDB Java Driver类似,但我的问题不同,因为我对使用Jackson进行映射感兴趣.

我有一个对象,我想将其转换为Mongo DBObject实例.我想使用Jackson JSON框架来完成这项工作.

一种方法是:

DBObject dbo = (DBObject)JSON.parse(m_objectMapper.writeValueAsString(entity));

然而,根据https://github.com/FasterXML/jackson-docs/wiki/Presentation:-Jackson-Performance的说法,这是最糟糕的方式.所以,我在寻找另一种 Select .理想情况下,我希望能够连接到JSON生成管道并动态填充DBObject实例.这是可能的,因为在我的例子中,目标是一个BasicDBObject实例,它实现了Map接口.因此,它应该可以很容易地安装到管道中.

现在,我知道我可以使用ObjectMapper.convertValue函数将对象转换为Map,然后使用BasicDBObject类型的Map构造函数将Map递归转换为BasicDBObject实例.但是,我想知道我是否可以消除中间映射,直接创建BasicDBObject.

注意,因为BasicDBObject本质上是一个映射,所以相反的转换,即从标量DBObject到POJO的转换非常简单,应该非常有效:

DBObject dbo = getDBO();
Class clazz = getObjectClass();
Object pojo = m_objectMapper.convertValue(dbo, clazz);

最后,我的POJO没有任何JSON注释,我希望它保持这种方式.

推荐答案

您可能可以使用Mixin注释来注释POJO和BasicDBObject(或DBObject),因此注释不是问题.因为BasicDBOject是一个映射,所以可以在put方法中使用@JsonAnySetter.

m_objectMapper.addMixInAnnotations(YourMixIn.class, BasicDBObject.class);

public interface YourMixIn.class {
    @JsonAnySetter
    void put(String key, Object value);
}

这就是我能想到的,因为我对MongoDB对象没有任何经验.

Update:MixIn基本上是一种Jackson机制,用于在不修改所述类的情况下向类添加注释.当您无法控制要封送的类(比如来自外部jar的类)或不想用注释扰乱类时,这是一个完美的 Select .

在这里的例子中,您说BasicDBObject实现了Map接口,因此该类具有由map接口定义的方法put.通过向该方法添加@JsonAnySetter,您可以告诉Jackson,每当他在类的内省后发现一个他不知道的属性时,就可以使用该方法将该属性插入到对象中.键是属性的名称,值是属性的值.

所有这些结合起来,中间映射就消失了,因为Jackson将直接转换为BasicDBOject,因为它现在知道如何从Json反序列化该类.通过该配置,您可以执行以下操作:

DBObject dbo = m_objectMapper.convertValue(pojo, BasicDBObject.class);

请注意,我没有测试这一点,因为我不使用MongoDB,所以可能存在一些漏洞.然而,我对类似的用例使用了相同的机制,没有任何问题.YMMV取决于课程.

Mongodb相关问答推荐

如何限制/筛选子文档中的条目?

如何将空值单独分组?

如何用Python和MongoDB找到单据字段的最大值?

MongoDB 按 created_at 月聚合

如何判断 MongoDB 的两个数组中是否存在值?

根据聚合管道MongoDB Atlas触发器中的条件更新多个字段

在MongoDb的数组中计算大于某个数字的数字

MongoDB:如何将所有文档合并到聚合管道中的单个文档中

MongoDB映射/减少多个集合?

使用 Node.js 和 mongodb 处理超时

如何知道 MongoDB 集合大小?

为什么 PyMongo 会抛出 AutoReconnect?

为多个日期范围聚合 $group

Node + Mongoose:获取最后插入的 ID?

Spring Data MongoDB 中的独特之处

插入违反唯一索引的 MongoDB 文档时如何捕获错误?

如何在 Meteor 应用程序之间共享 MongoDB 集合?

无法将 Mongoose 连接到 Atlas

如何将转储文件夹导入 mongodb 数据库?

使用 mongoengine 将多文档插入到 mongodb