Spring boot整合Mongodb
最近的项目用了Mongodb,网上的用法大多都是七零八落的没有一个统一性,自己大概整理了下,项目中的相关配置就不叙述了,由于spring boot的快捷开发方式,所以spring boot项目中要使用Mongodb,只需要添加依赖和配置application.properties文件即可。整和方式一共有两种,一种是JPA的快捷方式,还有一种是实现MongoTemplate中的方法。
一、spring boot Mongodb JPA
这种是mongodb的快捷开发方式,类似于spring data jpa的操作,通过使用spring boot约定的规范来定义名字,与HibernateRepository类似,通过继承MongoRepository接口,我们可以非常方便地实现对一个对象的增删改查,要使用Repository的功能,先继承MongoRepository<T, TD>接口,其中T为仓库保存的bean类,TD为该bean的唯一标识的类型,一般为ObjectId。之后在service中注入该接口就可以使用,无需实现里面的方法,spring会根据定义的规则自动生成。
创建一个bean,其中@id是这种表的主键,user就是表的名字
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import org.springframework.data.annotation.Id; public class User { @Id private Long id; private String name; private Integer userage; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getUserage() { return userage; } public void setUserage(Integer userage) { this.userage = userage; } public User(Long id, String name, Integer userage) { super(); this.id = id; this.name = name; this.userage = userage; } }
通过jpa的方式实现查找,下面介绍最简单的两张和定义规则:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import org.springframework.data.mongodb.repository.MongoRepository; public interface UserMongodbJPA extends MongoRepository<User, Long>{ /** * * 单个条件查询,通过名字到数据 * 方法名字定义规则: * find +By+条件字段(必须是User中的属性) */ List<User> findByName(String name); /** * 多个条件查询,通过年龄和名字找到数据 * 方法名字定义规则: * * ind +By+条件字段(必须是User中的属性)+AND+条件字段(必须是User中的属性) */ List<User> findByUserageAndName(Integer userage,String name ); }
具体的其他命名规则,可通过下面的图进行查阅:
二、Spring boot Mongodb原生实现方式
JAP的方式虽然简单快捷,但是这种方式只能进行简单的查询操作,但是业务中往往需要复杂的逻辑操作,这时就不满足我们的需求,所以使用原生的方式,就能解决复制的逻辑业务。这种方式通过继承MongoRepository接口,只需要调用MongoTemplate中的方法即可。
插入数据
MongoTemplate为我们提供了两种方法插入数据:insert和save,两者的区别就是insert方法如果插入的数据的主键已经存在,则会抛出异常;save方法插入的数据的主键已经存在,则会对当前已经存在的数据进行修改操作。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
private MongoTemplate mongoTemplate; /** * insert方法,会新增一条数据 */ public void insert(){ User u = new User("1","zhangsan",18); mongoTemplate.insert(u); } /** * save方法,如果主键重复,则修改原来的数据 */ public void save() { User u = new User("1","小明",19); mongoTemplate.save(u); }
更新数据
更新一条数据,在关系型数据库中,我们需要where条件筛选出需要更新的数据,并且要给定更新的字段及值,在mongodb中也是一样,如果要使用筛选条件,就必须实例化Query对象。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * 要使用原生的mongodb方式,就要创建MongoTemplate , *他的方法来实现SQL */ private MongoTemplate mongoTemplate; /** * 更新对象 */ public void updateTest() { //用来封装所有条件的对像 Query query = new Query(); //用来构建条件 Criteria criteria = new Criteria(); //criteria.and("你MongoDB中的key").is("你的条件") criteria.and("name").is("小明"); //把条件封装起来 query.addCriteria(criteria) ; // Update 中构建更新的内容 Update update= new Update().set("userage", "15").set("name", "小红"); //更新查询返回结果集的第一条 mongoTemplate.updateFirst(query,update,MongoTest.class); //更新查询返回结果集的所有 mongoTemplate.updateMulti(query,update,User.class); }
删除数据
删除数据和更新数据类似,只需要使用MongoTemplate中的remove方法就能实现。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
** * 删除对象 *、 */ public void deleteTestById() { Query query=new Query(Criteria.where("name").is("小红")); mongoTemplate.remove(query,User.class); } 、
三、聚合操作
在mysql数据库中,我们更多情况我们会使用聚合操作来简便我们的代码,列如SUM、count;在mongodb的数据库中,也是有这样的聚合函数,但是这时不在使用Query对象来封装条件,而是使用Aggregation对象来实现聚合操作,需要注意的是:mongoTemplate.aggregate实现的方法返回的是AggregationResults对象。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public AggregationResults<T> aggregation(int pageNum, int pageSize, Criteria criteria,String name, String sortName, Sort sort,String tableName) throws BbsException { Aggregation aggregation = Aggregation.newAggregation( Aggregation.match(criteria),//用于过滤数据,只输出符合条件的文档 Aggregation.group(name);//将集合中的文档根据fileID分组,可用于统计结果。 Aggregation.sort(sort), //将输入文档根据sort排序后输出。 Aggregation.skip(pageNum - 1) * pageSize),//在聚合管道中跳过指定数量的文档,并返回余下的文档。 Aggregation.limit(pageSize),//用来限制MongoDB聚合管道返回的文档数。 Aggregation.sum(userage)//用来求和,求出userage字段值的和 ); return mongoTemplate.aggregate(aggregation, tableName, user.class);//tableName表示表的名字