当前位置: 首页 > news >正文

MongodbTemplate的增删改操作

插入数据操作

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

@Document(collection="student")
public class Student {

    private String studentId;
    private String name;
    private int age;
    private String sex;
    public String getStudentId() {
        return studentId;
    }
    public void setStudentId(String studentId) {
        this.studentId = studentId;
    }
    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;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
}

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

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

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

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

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

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

更新数据操作

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

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

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

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

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

添加内嵌文档中的数据

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

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

修改内嵌文档中的数据

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

删除内嵌文档中的数据

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

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

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

删除操作

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

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

相关文章:

  • Exchange2003升级至Exchange2007
  • 第十九、二十周作业微职位
  • Linux命令(十一)——Shell程序设计二(循环控制语句)
  • 现代软件工程 M1 博客要求
  • nodejs上使用sql
  • 3DS Max的单位设置
  • 默认标签解析
  • 数据库书上概念摘抄
  • c#中取整,向上取,向下取
  • 最近开始温习C#
  • Steve Thair谈DevOps on Windows的演变与面临的挑战
  • [MFC] MFC 获取指定窗口截图(大小可调)
  • 年末裁员事件背后的启示录(2)
  • 谈谈基于Kerberos的Windows Network Authentication
  • 真人拳皇项目第三次Scrum总结——史经浩
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • AngularJS指令开发(1)——参数详解
  • Gradle 5.0 正式版发布
  • input的行数自动增减
  • JavaScript DOM 10 - 滚动
  • KMP算法及优化
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • React-生命周期杂记
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • 对象管理器(defineProperty)学习笔记
  • 二维平面内的碰撞检测【一】
  • 给第三方使用接口的 URL 签名实现
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 七牛云假注销小指南
  • 前嗅ForeSpider中数据浏览界面介绍
  • 提醒我喝水chrome插件开发指南
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 交换综合实验一
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​MySQL主从复制一致性检测
  • # .NET Framework中使用命名管道进行进程间通信
  • #、%和$符号在OGNL表达式中经常出现
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #微信小程序(布局、渲染层基础知识)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Oracle)SQL优化技巧(一):分页查询
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (算法二)滑动窗口
  • (循环依赖问题)学习spring的第九天
  • (一) springboot详细介绍
  • (一)RocketMQ初步认识
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • .bashrc在哪里,alias妙用