mongdb
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"); |