mongoTemplate + Java 增删改查基础介绍

MongoDB是一款非常优秀的文档型数据库,主要以Bejson数据结构来存储数据,在某些场景下比主流关系型数据库mysql更适合业务场景。

换句话说对事务和数据严谨性要求不高的场景,比如用户评论 点赞、短信、日志和一些并发低不要求事务的实际业务等等,都可以使用mongo数据库。

一、集成springboot

java 复制代码
<dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-mongodb</artifactId>
 </dependency>

springboot全家桶非常好的集成了MongoDB,只需要引入依赖包,即可引入

mongoTemplate对增删改查操作都做了封装,基本上拿来即用,只需要熟练掌握其中具体操作步骤即可轻松掌握mongo

java 复制代码
@Resource
private MongoTemplate mongoTemplate;

二、使用

核心掌握增删改查四大方法

1、查询

(1)、普通查询

查询单个数据,使用Criteria来添加条件,使用findOne(条件query,返回值类型,表名)来执行查询,无需写具体查询语句;

java 复制代码
Query q= new Query();

q.addCriteria(Criteria.where("user_name").is("小王"));

q.fields().exclude("_id").include("content");

//确定结果为1个时,如使用id查询,使用findOne

JSONObject JS =  mongoTemplate.findOne(q, JSONObject.class,CommonConts.users);

//当结果可能为多个时,使用find

List<JSONObject> list=  mongoTemplate.find(q, JSONObject.class,CommonConts.users);

(2)、复杂查询

假设存在一张用户表user,有三个字段 user_name age和sex,则可以执行以下查询

下面这个例子完整展示了使用来Aggregation进行复杂查询

默认分页对象:

java 复制代码
public class Page{

   private int pageSize;

   private int startPage;

   private Long totalResult;

}

查询示例:

java 复制代码
public List<JSONObject> queryTest(String params,Page page) {



Criteria c = new Criteria();



JSONObject JSON = MyUtils.fromJson(params);



//1、 通过user_name模糊查询

List<Criteria> cl = new ArrayList<>();



Criteria c1 = Criteria.where("user_name") .regex(Pattern.compile("^.*" + JSON.opt("user_name") + ".*$",                 

 Pattern.CASE_INSENSITIVE));



 cl.add(c1);



//2、判断是否存在某个查询条件

if (MyUtils.isNotNull(JSON.opt("sex"))) {

Criteria c2 = Criteria.where("sex").is(JSON.opt("sex"));

cl.add(c2);

}

if (MyUtils.isNotNull(JSON.opt("age"))) {

Criteria c3 = Criteria.where("age").is(JSON.opt("age"));

cl.add(c3);

}

//3、将所有的条件合并到一起,注意这里使用andOperator是并查询操作,使用orOperator则是或查询操作

c.andOperator(cl.toArray(new Criteria[0]));



//4、执行查询,

Aggregation agg = Aggregation.newAggregation(Aggregation.match(c),



Aggregation.project().and(ConvertOperators.Convert.convertValueOf("_id").to("string")).as("id")



.andExclude("_id").and("user_name").as("user_name").and("sex")



.as("sex").and("age").as("age"),



Aggregation.sort(new Sort(Sort.Direction.DESC, "age")),//根据年龄大小排序

     // 进行分页配置

     Aggregation.skip(page.getPageSize() * (page.getStartPage() - 1)),

     Aggregation.limit(page.getPageSize().intValue()));

AggregationResults<JSONObject> res= mongoTemplate.aggregate(agg, "user",



JSONObject.class);



return res.getMappedResults();

}

注意:关于查询还有其他内容比如关联、id处理、查询count等将在其他文章讲解

2、新增

使用insert 来执行新增操作,插入对象可以是JSON、对象实体、map等,当为集合时,则批量插入。插入成功后,数据库会存在一条数据,并且会自动生成一个_id字段

java 复制代码
JSONObject json =new JSONObject();

json.put("user_name", "小王");

json.put("age", 18);

json.put("sex","男");

mongoTemplate.insert(json, "user");

注意:MongoDB表不用先建表然后再执行插入操作,可以直接进行插入操作,当不存在表时候会自动建表,然后再执行插入操作。另外,使用mongoTemplate来插入数据时候,如果想要获取_id值,可以使用对象插入如:

java 复制代码
public void testInsert(){

   User user =new User();

   user.setName("小王");

  mongoTemplate.insert(json, "user");

}

3、修改

使用findAndModify来执行修改操作,四个参数分别是修改条件、修改内容、返回值和表

java 复制代码
String id="1223ss";

Query q = new Query();

q.addCriteria(Criteria.where("_id").is(id);

Update u = new Update();

u.set("user_name","小章");

u.set("age",28);

mongoTemplate.findAndModify(q, u, JSONObject.class, "user");

4、删除

使用findAndRremove来执行删除操作,参数分别对应为:删除条件,返回值和表

java 复制代码
String id="1223ss";

Query q = new Query();

q.addCriteria(Criteria.where("_id").is(id);

mongoTemplate.findAndRemove(q, JSONObject.class, "user");
相关推荐
IpdataCloud13 分钟前
高可用的IP数据接口平台有哪些?从可用性、P99延迟到离线部署的评估框架(含代码)
数据库·tcp/ip·ip
我不会起名字32224 分钟前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣
呆萌很29 分钟前
MySQL 数据库和表的管理操作(命令行)
数据库·mysql
毕业设计7031 小时前
(免费领源码)基于Python的博物馆研学活动管理系统的设计与实现22724- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
python·mysql·随机森林·pycharm·django·flask·推荐算法
IvorySQL1 小时前
当PostgreSQL“听懂”MySQL——协议兼容层的设计与实战
数据库·人工智能·postgresql
这个DBA有点耶2 小时前
银行核心系统数据库迁移怎么选?6 步法+5 个避坑指南
数据库·安全·架构
风哥2号2 小时前
数据库教程FGMT31‑Linux平台MySQL9.7安装配置与版本升级
数据库
hanchenxing2 小时前
前端异步任务三方案:Celery vs Redis Stream vs BullMQ 实战对比消息队列
前端·数据库·redis·异步任务·方案对比
Logic1013 小时前
C语言/数据结构位运算题解:异或XOR找出货船中的“独特载货量“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
java_logo3 小时前
Docker 部署 Milvus:轻松搭建高性能向量数据库平台
数据库·docker·私有化部署·milvus·向量数据库·rag·轩辕镜像