MongoDB中_class字段的作用
我们知道,如果你用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字段的作用相关推荐
- MongoDB中的字段类型Id
众所周知,在向MongoDB的集合中添加一条记录时,系统会自动增加一个字段名为"_id",类型为ObjectId的字段,其值为24位字符串,可以使用此值作为记录的唯一标识. 项目中 ...
- mongodb @aggregation 返回字段映射不上_MongoDB---基于分布式文件存储的数据库(二)...
MongoDB基础入门到高级进阶视频教程 [MongoDB] 六.Document 操作 在MongoDB中文档是指多个键及其关联的值有序地放置在一起就是文档,其实指的就是数据,也是我们平时操作最多的 ...
- SpringBoot MongoDB 插入内容去掉_class字段
看了一些网上去掉_class的文章 基本都是一样的 加个MongoConfig 配置文件,而且没有参考源码.直接添加一个MongoConfig 配置文件并没有什么效果,可能是还有别的地方需要做修改吧, ...
- SAP MM 物料主数据采购视图中的字段'Var. OUn'的作用?
SAP MM 物料主数据采购视图中的字段'Var. OUn'的作用? 物料主数据采购视图里有一个字段,叫做'Var. OUn'的, 如下图: 这个字段,笔者之前所参与的项目里,从来没有用过.所以,笔者 ...
- mongo 改字段名_一日一技:修改MongoDB集合中的字段名
一日一技:修改MongoDB集合中的字段名 一日一技是一个每天更新的栏目,旨在使用3分钟的时间让你每天都有新的进步. 在我们使用MongoDB的过程中,经常会出现修改数据的情况.我们一般使用 upda ...
- kettle增加字段报错_【实战】使用 Kettle 工具将 mysql 数据增量导入到 MongoDB 中
每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定. 放弃不难,但坚持很酷~ 最近有一个将 mysql 数据导入到 MongoDB 中的需求,打算使用 Kettle 工具实现.本文章记录了数据导入 ...
- 2021-05-11 MongoDB面试题 分析器在MongoDB中的作用是什么
分析器在MongoDB中的作用是什么? MongoDB中包括了一个可以显示数据库中每个操作性能特点的数据库分析器.通过这个分析器你可以找到比预期慢的查询(或写操作);利用这一信息,比如,可以确定是否需 ...
- mongodb和mysql中自动增长id_如何在java中维护MongoDB的_id字段的自动增长
_id字段是MongoDB中一个特殊的字段,它的类型为BSON ObjectId.它是每条记录的第一个属性,并且该属性值必须唯一. BSON ObjectId长12个字节,包含4字节的时间戳.3字节的 ...
- NodeJS 中的mongoDB设置指定字段的隐藏,查询的时候强制显示指定隐藏的字段
NodeJS 中的mongoDB设置指定字段的隐藏,查询的时候强制显示指定隐藏的字段 这里使用的是基于RESTful API的规范创建的请求地址 在Schema创建用户的时候可以使用select:fa ...
最新文章
- flask与简单的form表单
- CSS布局之品字布局
- zuul路由前缀配置
- js防篡改对象之不可扩展对象
- CSAPP--整数的表示
- C++期末实践程序设计与数组作为参数的注意事项
- Session的创建与销毁时机
- hdu Super Jumping
- xp下创建DOMDocument对象失败的解决方法
- Redhat终端中文乱码解决
- Opencv图像显示
- selenium弹窗处理,包括Javascript弹窗、HTML弹出层和Windows弹窗
- 计算机表格斜线怎么打字上去,excel表格斜杠怎么分割打字,表格画线怎么画斜线...
- 生产可能性曲线与机会成本
- 闪电贷攻击又背锅? “幕后元凶”竟是它!
- doctype html5什么意思,是什么意思?
- android计算器实训报告总结,大学生计算机实训报告
- 20155318 《网络攻防》Exp4 恶意代码分析
- 进制之间的转换(补充版)
- boot lvm 分区_Linux系统常规分区和LVM分区