mongoTemplate 常见操作

Posted longlongbug

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongoTemplate 常见操作相关的知识,希望对你有一定的参考价值。


插入数据

将参数转换成一个对象,直接调用insert方法即可: 
举例:

  1. @Document(collection="student")
  2. public class Student {
  3.  
  4.     private String studentId;
  5.     private String name;
  6.     private int age;
  7.     private String sex;
  8.     public String getStudentId() {
  9.         return studentId;
  10.     }
  11.     public void setStudentId(String studentId) {
  12.         this.studentId = studentId;
  13.     }
  14.     public String getName() {
  15.         return name;
  16.     }
  17.     public void setName(String name) {
  18.         this.name = name;
  19.     }
  20.     public int getAge() {
  21.         return age;
  22.     }
  23.     public void setAge(int age) {
  24.         this.age = age;
  25.     }
  26.     public String getSex() {
  27.         return sex;
  28.     }
  29.     public void setSex(String sex) {
  30.         this.sex = sex;
  31.     }
  32. }

首先创建一个javabean@Document注解是指定该对象和哪个collection对应。

然后我们将要存入的数据封装到这个对象中,并调用mongodbTemplateinsert方法。

  1. public void insert(){
  2.     Student student = new Student("1","zhangsan",18,"");
  3.     mongoTemplate.insert(student);
  4. }

当然,在开发中复杂的数据结构是比较常见的,例如我们需要存储嵌套文档的时候,如果直接使用javabean是比较麻烦的,这种比较复杂的数据结构,我们只需要拿到json字符串,并将其转换成json对象,即可直接插入到mongodb中。

  1. public void insert(){
  2.     String classStr = "{'classId':'1','Students':[{'studentId':'1','name':'zhangsan'}]}";
  3.     JSONObject parseObject = JSON.parseObject(classStr);
  4.     mongoTemplate.insert(parseObject,"class");
  5. }

insert方法有一个缺陷,就是每调用一次,就会插入一条新的数据,但是有很多时候,我们需要如果数据存在,则修改,如果不存在,则插入,这个时候,更新操作是比较常用的。



更新数据操作

更新一条数据,在关系型数据库中,我们需要where条件筛选出需要更新的数据,并且要给定更新的字段及值,在mongodb中也是一样,我们需要给定条件和值:

  1. public void update(){
  2.     Query query = new Query();
  3.     query.addCriteria(Criteria.where("classId").is("1"));
  4.     Update update = Update.update("teacher", "Mr.wang");
  5.     mongoTemplate.upsert(query, update, "class");
  6. }

classId1的数据中修改teacher字段为Mr.wang,如果这条数据中没有teacher字段,则会添加该字段。 
mongodbTemplate
中还有另外一个更新方法:

  1. mongoTemplate.updateFirest(query, update, "class");
  2. mongoTemplate.updateMulti(query, update, "class");

这个两个方法一个是更新满足条件的第一条数据,一个是更新所有满足条件的数据,它们和upsert的区别就是,如果query条件没有筛选出对应的数据,那么upsert会插入一条新的数据,而update则什么都不会做。和关系型数据库中的mergeupdate的一样。

添加内嵌文档中的数据

  1. Query query = Query.query(Criteria.where("classId").is("1"));
  2. Student student = new Student("1", "lisi", 18, "man");
  3. Update update = new Update();
  4. //update.push("Students", student);
  5. update.addToSet("Students", student);
  6. mongoTemplate.upsert(query, update, "class");

addToSet如果数据已经存在,则不做任何操作,而push会插入一条一样的数据。

修改内嵌文档中的数据

  1. public void update(){
  2.     Query query = Query.query(Criteria.where("classId").is("1")
  3.                 .and("Students.studentId").is("1"));
  4.     Update update = Update.update("Students.$.name", "lisi");
  5.     mongoTemplate.upsert(query, update, "class");
  6. }

删除内嵌文档中的数据

  1. Query query = Query.query(Criteria.where("classId").is("1")
  2.                 .and("Students.studentId").is("3"));
  3. Update update = new Update();
  4. update.unset("Students.$");
  5. mongoTemplate.updateFirst(query, update, "class");

这种方法有一个缺陷,会将符合条件的数据修改成null,如果要彻底删除,则需要使用pull(pull删除内嵌文档的时候,student对象的值一定要和被删除的一模一样)

  1. Query query = Query.query(Criteria.where("classId").is("1"));
  2. Update update = new Update();
  3. Student student = new Student("2","lisi",18,"man");
  4. update.pull("Students",student);
  5. mongoTemplate.updateFirst(query, update, "class");


删除操作

  1. Query query = Query.query(Criteria.where("classId").is("1"));
  2. mongoTemplate.remove(query,"class");

remove操作是直接将所有满足条件的数据给删除,如果只是要删除内嵌文档中的数据,则需要使用上面更新操作。

以上是关于mongoTemplate 常见操作的主要内容,如果未能解决你的问题,请参考以下文章

mongoTemplate 常见操作

mongodb-mongotemplate进行地理坐标操作

mongoTemplate聚合操作Demo

MongoTemplate 操作 mongodb

一个基于mongoDB的 MongoTemplate 的基本操作类

MongoTemplate实现根据某个字段分类查询