最近的項目用了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就是表的名字


import org.springframework.data.annotation.Id;public class User {@Idprivate 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的方式實現查找,下面介紹最簡單的兩張和定義規則:


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方法插入的數據的主鍵已經存在,則會對當前已經存在的數據進行修改操作。? ??


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對象。


/*** 要使用原生的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方法就能實現。


*** 刪除對象*、*/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對象。


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表示表的名字
?
?
?
?
?
?
?
?