首页 >  mongdb >  mongoTemplate增删改查基础介绍

mongoTemplate增删改查基础介绍

时间:2023-12-23

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

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

一、集成springboot

<dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-mongodb</artifactId>
 </dependency>

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

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

@Resource
private MongoTemplate mongoTemplate;

二、使用

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

1、查询

(1)、普通查询

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

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,"users");

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

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

(2)、复杂查询

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

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

默认分页对象:

public class Page{

   private int pageSize;

   private int startPage;

   private Long totalResult;

}

查询示例:

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, "users",
 
JSONObject.class);
 
return res.getMappedResults();
}

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

2、新增

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

JSONObject json =new JSONObject();

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

json.put("age", 18);

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

mongoTemplate.insert(json, “users”);

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

public void testInsert(){

   User user =new User();

   user.setName("小王");

  mongoTemplate.insert(user, “users”);

}

 

3、修改

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

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, "users");

 

4、删除

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

String id="1223ss";

Query q = new Query();

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

mongoTemplate.findAndRemove(q, JSONObject.class, "users");