我们知道,如果你用Java的Sping Data 框架映射Pojo为MongoDB数据时,数据库中会自动给你添加一个_class字段,那这个字段是干嘛用的呢?我们可以不可以不要这个字段呢?

直接上结论:答案其实很简答,这个字段就是用来映射Pojo的,更具体的说,是为了方便处理Pojo中存在继承的情况,增加系统的扩展性的,接下来上例子:

_class字段帮助映射子类

为了方便演示,这里用Spring Data 给我们提供的mongoTemplate来操作。有关mongoDB和Spring Data的环境我就不贴了,直接上测试代码:

拥有继承关系的实体类

@Document是把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。

父类Person

@Document(collection = "test")
public class Person {protected String name;protected int age;//set/get方法public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

子类 Student

@Document(collection = "test")
public class Student extends Person {String a;String b;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", a='" + a + '\'' +", b='" + b + '\'' +'}';}public String getA() {return this.a;}public void setA(String a) {this.a = a;}public String getB() {return this.b;}public void setB(String b) {this.b = b;}
}

Dao层

Dao接口

public interface PersonDao {void addPerson(Person person);Person findPersonByName(String name);
}

Dao实现

@Repository
public class PersonDapImpl implements PersonDao {@AutowiredMongoTemplate mongoTemplate;@Overridepublic void addPerson(Person person) {mongoTemplate.save(person);}@Overridepublic Person findPersonByName(String name) {Query query = new Query(Criteria.where("name").is(name));Person person = mongoTemplate.findOne(query, Person.class);return person;}
}

测试方法

public class PersonDapImplTest extends BaseTest {@AutowiredPersonDao personDao;@Testpublic void addPerson() {Person person = new Person();person.setName("张");person.setAge(10);personDao.addPerson(person);}@Testpublic void addStudent() {Student student = new Student();student.setName("小张");student.setAge(12);student.setA("a");student.setB("b");personDao.addPerson(student);}@Testpublic void findPerson() {System.out.println("==============开始查找==============");Person person = personDao.findPersonByName("小张");System.out.println();System.out.println();System.out.println();if (person != null) {System.out.println(person.toString());}else {System.out.println("null");}}
}

测试结论

测试中,小张是张的子类,mongoDB中已经插入了2条数据:

查询小张,得到的类是Student类吗?

可以看到,最终展示的是Student的详细信息,说明_class能帮助我们反序列化出子类。

那如果去掉了_class列,会是什么样呢?

去掉_class

去掉_class的方法需要配置一下

需要配置MappingConverter:更详细的去掉_class的方法可以参考其他博文。

  @Beanpublic MappingMongoConverter mappingMongoConverter(MongoDbFactory factory,MongoMappingContext context, BeanFactory beanFactory, CustomConversions conversions) {DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);// remove _class field
//    mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));mappingConverter.setCustomConversions(conversions);return mappingConverter;}

去掉_class后:

再次查询"小张"

可以看到,mongoDB无法帮助我们来映射子类了。返回的数据被反序列化成了Person类。

转载于:https://www.cnblogs.com/keeya/p/9969535.html

MongoDB中_class字段的作用相关推荐

  1. MongoDB中的字段类型Id

    众所周知,在向MongoDB的集合中添加一条记录时,系统会自动增加一个字段名为"_id",类型为ObjectId的字段,其值为24位字符串,可以使用此值作为记录的唯一标识. 项目中 ...

  2. mongodb @aggregation 返回字段映射不上_MongoDB---基于分布式文件存储的数据库(二)...

    MongoDB基础入门到高级进阶视频教程 [MongoDB] 六.Document 操作 在MongoDB中文档是指多个键及其关联的值有序地放置在一起就是文档,其实指的就是数据,也是我们平时操作最多的 ...

  3. SpringBoot MongoDB 插入内容去掉_class字段

    看了一些网上去掉_class的文章 基本都是一样的 加个MongoConfig 配置文件,而且没有参考源码.直接添加一个MongoConfig 配置文件并没有什么效果,可能是还有别的地方需要做修改吧, ...

  4. SAP MM 物料主数据采购视图中的字段'Var. OUn'的作用?

    SAP MM 物料主数据采购视图中的字段'Var. OUn'的作用? 物料主数据采购视图里有一个字段,叫做'Var. OUn'的, 如下图: 这个字段,笔者之前所参与的项目里,从来没有用过.所以,笔者 ...

  5. mongo 改字段名_一日一技:修改MongoDB集合中的字段名

    一日一技:修改MongoDB集合中的字段名 一日一技是一个每天更新的栏目,旨在使用3分钟的时间让你每天都有新的进步. 在我们使用MongoDB的过程中,经常会出现修改数据的情况.我们一般使用 upda ...

  6. kettle增加字段报错_【实战】使用 Kettle 工具将 mysql 数据增量导入到 MongoDB 中

    每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定. 放弃不难,但坚持很酷~ 最近有一个将 mysql 数据导入到 MongoDB 中的需求,打算使用 Kettle 工具实现.本文章记录了数据导入 ...

  7. 2021-05-11 MongoDB面试题 分析器在MongoDB中的作用是什么

    分析器在MongoDB中的作用是什么? MongoDB中包括了一个可以显示数据库中每个操作性能特点的数据库分析器.通过这个分析器你可以找到比预期慢的查询(或写操作);利用这一信息,比如,可以确定是否需 ...

  8. mongodb和mysql中自动增长id_如何在java中维护MongoDB的_id字段的自动增长

    _id字段是MongoDB中一个特殊的字段,它的类型为BSON ObjectId.它是每条记录的第一个属性,并且该属性值必须唯一. BSON ObjectId长12个字节,包含4字节的时间戳.3字节的 ...

  9. NodeJS 中的mongoDB设置指定字段的隐藏,查询的时候强制显示指定隐藏的字段

    NodeJS 中的mongoDB设置指定字段的隐藏,查询的时候强制显示指定隐藏的字段 这里使用的是基于RESTful API的规范创建的请求地址 在Schema创建用户的时候可以使用select:fa ...

最新文章

  1. flask与简单的form表单
  2. CSS布局之品字布局
  3. zuul路由前缀配置
  4. js防篡改对象之不可扩展对象
  5. CSAPP--整数的表示
  6. C++期末实践程序设计与数组作为参数的注意事项
  7. Session的创建与销毁时机
  8. hdu Super Jumping
  9. xp下创建DOMDocument对象失败的解决方法
  10. Redhat终端中文乱码解决
  11. Opencv图像显示
  12. selenium弹窗处理,包括Javascript弹窗、HTML弹出层和Windows弹窗
  13. 计算机表格斜线怎么打字上去,excel表格斜杠怎么分割打字,表格画线怎么画斜线...
  14. 生产可能性曲线与机会成本
  15. 闪电贷攻击又背锅? “幕后元凶”竟是它!
  16. doctype html5什么意思,是什么意思?
  17. android计算器实训报告总结,大学生计算机实训报告
  18. 20155318 《网络攻防》Exp4 恶意代码分析
  19. 进制之间的转换(补充版)
  20. boot lvm 分区_Linux系统常规分区和LVM分区

热门文章

  1. Shell 数组中 @ 跟 * 的区别
  2. leetcode算法题--数字序列中某一位的数字
  3. leetcode算法题--重建二叉树
  4. 16进制数组转成10进制 qt_计算机组成原理(进制数及转换)
  5. redhat nginx php mysql_redhat7+nginx+mysql+php
  6. CAP原理和BASE思想
  7. Redis 为什么用跳表而不用平衡树?
  8. Android自动化测试之虚拟机中软件安装方法(四)
  9. 关于Python类属性与实例属性的讨论
  10. 一款小巧好用的MAC地址扫描器