mongodb - Spring数据MongoDb : MappingMongoConverter

默认的MappingMongoConverter 为数据库中的每个对象添加一个自定义类型键(“_class”)。所以,如果我创建一个人:

package my.dto;
public class Person {
    String name;
    public Person(String name) {
        this.name = name; 
    }
}

并将其保存到数据库:

MongoOperations ops = new MongoTemplate(new Mongo(), "users");
ops.insert(new Person("Joe"));

mongo 中的结果对象将是:

{ "_id" : ObjectId("4e2ca049744e664eba9d1e11"), "_class" : "my.dto.Person", "name" : "Joe" }

问题:

  1. 将 Person 类移到不同的命名空间有什么影响?

  2. 是否可以不污染“_class”键的对象;没有为 Person 类编写唯一的转换器?

最佳答案

所以故事是这样的:我们默认添加类型作为某种提示,以实际实例化哪个类。由于您必须通过管道输入类型以通过 MongoTemplate 将文档读入其中,因此有两种可能的选择:

  1. 您提交一个可以分配实际存储类型的类型。在这种情况下,我们考虑存储类型,将其用于对象创建。这里的经典示例是进行多态查询。假设你有一个抽象类 Contact 和你的 Person。然后,您可以查询 Contact,我们基本上必须确定要实例化的类型。
  2. 另一方面,如果您传入一个完全不同的类型,我们只需编码为该给定类型,而不是实际存储在文档中的类型。这将涵盖您的问题,如果您移动类型会发生什么。

您可能有兴趣观看 this ticket它涵盖了某种可插入的类型映射策略,以将类型信息转换为实际类型。这可以简单地用于节省空间的目的,因为您可能希望将长限定类名减少为几个字母的散列。它还允许更复杂的迁移场景,您可能会找到由另一个数据存储客户端生成的完全任意类型键并将它们绑定(bind)到 Java 类型。

关于mongodb - Spring数据MongoDb : MappingMongoConverter remove _class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6810488/

相关文章:

mongodb - 在 mongodb 中存储图形

mongodb - mongo的命令行身份验证失败

mongodb - 如何在 MongoDB 中删除或删除集合?

python - 为什么使用 update_one 更新记录会引发 ValueError?

mongodb - 如何从 tar.gz 文件安装 Robomongo 作为 Ubuntu 15.1

mongodb - 为什么我不能使用 Homebrew 更新到最新的 MongoDB?

ruby-on-rails - Heroku 的 Rails、Mongoid 和 Unicorn 配

perl - 如何加快 MongoDB 插入/秒?

c# - ORM 与 NoSQL API 是多余的吗?

mongodb - Mongo 计算一组文档中每个值的出现次数