SpringBoot操作Mongodb的實(shí)現(xiàn)示例
引言
MongoDB 特點(diǎn)
1、MongoDB 是一個(gè)面向文檔存儲(chǔ)的數(shù)據(jù)庫(kù),操作起來(lái)比較簡(jiǎn)單和容易。
2、你可以在MongoDB記錄中設(shè)置任何屬性的索引(如:FirstName=“Sameer”,Address=“8 Gandhi Road”)來(lái)實(shí)現(xiàn)更快的排序。
3、你可以通過(guò)本地或者網(wǎng)絡(luò)創(chuàng)建數(shù)據(jù)鏡像,這使得MongoDB有更強(qiáng)的擴(kuò)展性。
4、如果負(fù)載的增加(需要更多的存儲(chǔ)空間和更強(qiáng)的處理能力) ,它可以分布在計(jì)算機(jī)網(wǎng)絡(luò)中的其他節(jié)點(diǎn)上這就是所謂的分片。
5、Mongo支持豐富的查詢(xún)表達(dá)式。查詢(xún)指令使用JSON形式的標(biāo)記,可輕易查詢(xún)文檔中內(nèi)嵌的對(duì)象及數(shù)組。
6、MongoDb 使用update()命令可以實(shí)現(xiàn)替換完成的文檔(數(shù)據(jù))或者一些指定的數(shù)據(jù)字段 。
7、Mongodb中的Map/reduce主要是用來(lái)對(duì)數(shù)據(jù)進(jìn)行批量處理和聚合操作。
8、Map和Reduce。Map函數(shù)調(diào)用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數(shù)進(jìn)行處理。
9、Map函數(shù)和Reduce函數(shù)是使用Javascript編寫(xiě)的,并可以通過(guò)db.runCommand或mapreduce命令來(lái)執(zhí)行MapReduce操作。
10、GridFS是MongoDB中的一個(gè)內(nèi)置功能,可以用于存放大量小文件。
11、MongoDB允許在服務(wù)端執(zhí)行腳本,可以用Javascript編寫(xiě)某個(gè)函數(shù),直接在服務(wù)端執(zhí)行,也可以把函數(shù)的定義存儲(chǔ)在服務(wù)端,下次直接調(diào)用即可。
12、MongoDB支持各種編程語(yǔ)言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語(yǔ)言。
1、初始化工程
使用 Spring Initializr 快速初始化一個(gè) Spring Boot 工程
2、依賴(lài)導(dǎo)入
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-mongodb --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
也可以說(shuō)是導(dǎo)入SpringData的mongodb依賴(lài)
3、添加配置
在application.properties文件添加配置
spring.data.mongodb.uri=mongodb://192.168.10.41:27017/lps #192.168.10.41為我的ip地址 27017為Mongodb端口號(hào) lps是數(shù)據(jù)庫(kù) 按需更改即可
4、添加實(shí)體類(lèi)
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; import java.util.Date; /** * @Description * @Author 劉品水 * @Data 2023/4/28 10:58 */ @Data @AllArgsConstructor @NoArgsConstructor @Document("users")//這個(gè)類(lèi)的實(shí)例代表mongodb的一條文檔 @AliasFor("collection") public class User { @Id private Integer id; @Field("username") private String name; @Field private Double salary; @Field private Date birthday; }
5、操作Mongodb
自動(dòng)裝配
@Autowired private MongoTemplate mongoTemplate;
創(chuàng)建集合
@Test void createCollection() { //判斷是否存在 boolean devIsExist = mongoTemplate.collectionExists("dev"); if (!devIsExist) { //不存在就創(chuàng)建 MongoCollection<Document> dev=mongoTemplate.createCollection("dev"); } }
刪除集合
@Test void testDropCollection() { //刪除集合 mongoTemplate.dropCollection("dev"); }
測(cè)試文檔添加功能
@Test void testDocAdd() { User user = new User(2, "彭于晏啊", 10086.00, new Date()); //文檔添加操作 mongoTemplate.save(user); //save插入已存在的數(shù)據(jù)會(huì)進(jìn)行更新 // mongoTemplate.insert(user);//insert插入已存在的數(shù)據(jù)會(huì)DuplicateKeyException異常 }
測(cè)試文檔批量添加功能
@Test void testDocBatchAdd() { List<User> userList = new ArrayList<>(); userList.add(new User(3, "吳彥祖", 10666.00, new Date())); userList.add(new User(4, "張無(wú)忌", 10886.00, new Date())); userList.add(new User(5, "蓋倫", 50086.00, new Date())); //文檔添加操作 mongoTemplate.insert(userList, User.class);//參數(shù):數(shù)據(jù),元素類(lèi)型 //批量處理推薦insert //insert一次性可以插入整個(gè)數(shù)據(jù) 效果較高 save需要遍歷整個(gè)數(shù)據(jù),一次插入或更新 效果較低 }
or、and內(nèi)容查詢(xún)功能
? @Testj ? ? void testDocFind() { ? ? ? ? //文檔查詢(xún)操作()查詢(xún)所有 ? ? ? ? List<User> users = mongoTemplate.findAll(User.class); // ? ? ?users.forEach(System.out::println); ? ? ? ? //基于id查詢(xún)一個(gè) ? ? ? ? User user = mongoTemplate.findById(1, User.class); // ? ? ? ?System.out.println(user); ? ? ? ? //條件Query查詢(xún)?nèi)? ? ? ? ? List<User> users1 = mongoTemplate.find(new Query(), User.class); ? ? ? ? //條件Query查詢(xún) ? ? ? ? List<User> users2 = mongoTemplate.find(Query.query(Criteria.where("name").is("劉品水")), User.class); // ? ? ? ?users2.forEach(System.out::println);//User(id=1, name=劉品水, salary=1000.0, birthday=Fri Apr 28 11:21:39 CST 2023) ? ? ? ? //條件 小于等于 大于等于 ?查詢(xún) less than equal | greater than equal ? ? ? ? List<User> users3 = mongoTemplate.find(Query.query(Criteria.where("salary").lte(10666)), User.class); ? ? ? ? List<User> users4 = mongoTemplate.find(Query.query(Criteria.where("salary").gte(10666)), User.class); ? ? ? ? //and 查詢(xún) ? ? ? ? List<User> users5 = mongoTemplate.find(Query.query(Criteria.where("name").is("劉品水").and("salary").is(1000)), User.class); ? ? ? ? //or 查詢(xún) ? ? ? ? Criteria criteria = new Criteria(); ? ? ? ? criteria.orOperator( ? ? ? ? ? ? ? ? Criteria.where("name").is("劉品水"), ? ? ? ? ? ? ? ? Criteria.where("salary").is(10086) ? ? ? ? ); ? ? ? ? List<User> users6 = mongoTemplate.find(Query.query(criteria), User.class); ? ? ? ? //or 和 and 查詢(xún) ? ? ? ? List<User> users7 =mongoTemplate.find(Query.query(Criteria.where("name").is("劉品水") ? ? ? ? ? ? ? ? .orOperator(Criteria.where("salary").is(1000))), User.class); ? ? ? ? users7.forEach(System.out::println); ? ? }
排序、分頁(yè)、條數(shù)、去重查詢(xún)功能
?@Test ? ? void testDocFindByDifferent() { ? ? ? ? //排序 ? ? ? ? Query querySort = new Query(); ? ? ? ? querySort.with(Sort.by(Sort.Order.desc("salary"))); ? ? ? ? List<User> users = mongoTemplate.find(querySort, User.class); ? ? ? ? //排序加分頁(yè) ? ? ? ? Query querySortAndPage = new Query(); ? ? ? ? querySortAndPage.with(Sort.by(Sort.Order.desc("salary"))) ? ? ? ? ? ? ? ? .skip(3) ? ? ? ? ? ? ? ? .limit(3); ? ? ? ? List<User> users1 = mongoTemplate.find(querySortAndPage, User.class); // ? ? ? ?users1.forEach(System.out::println); ? ? ? ? //查詢(xún)總條數(shù) ? ? ? ? long count = mongoTemplate.count(new Query(), User.class); ? ? ? ? System.out.println("總條數(shù)為"+count); ? ? }
使用JSON格式查詢(xún)
@Test void testDocFindByJSON() { //使用JSON字符串方式查詢(xún) BasicQuery basicQuery = new BasicQuery("{name: '劉品水',salary: 66686}"); BasicQuery basicQuery1 = new BasicQuery("{$or: [{name: '劉品水'},{salary: 50086}]}"); BasicQuery basicQuery2 = new BasicQuery("{$or: [{name: '劉品水'},{salary: 50086}]}","{name: 1}"); BasicQuery basicQuery3 = new BasicQuery("{$or: [{name: '劉品水'},{salary: 50086}]}","{salary: 0}"); List<User> users = mongoTemplate.find(basicQuery3, User.class); users.forEach(System.out::println); } BasicQuery basicQuery3 = new BasicQuery("{$or: [{name: '劉品水'},{salary: 50086}]}","{salary: 0}"); List<User> users = mongoTemplate.find(basicQuery3, User.class); users.forEach(System.out::println); }
文檔更新操作
@Test void testUpdate() { //更新操作 Update update = new Update(); update.set("salary", 99999); //更新符合條件的第一條 // mongoTemplate.updateFirst(Query.query(Criteria.where("name").is("張無(wú)忌")), update, User.class); //更新符合條件的多條 //mongoTemplate.updateMulti(Query.query(Criteria.where("name").is("張無(wú)忌")), update, User.class); //插入更新(沒(méi)有符合條件的數(shù)據(jù)的時(shí)候插入數(shù)據(jù)) update.setOnInsert("id", 9); UpdateResult updateResult = mongoTemplate.upsert(Query.query(Criteria.where("name").is("迪迦奧特曼")), update, User.class); System.out.println("獲取修改的計(jì)數(shù)"+updateResult.getModifiedCount());//獲取修改的計(jì)數(shù) System.out.println("獲取匹配計(jì)數(shù)"+updateResult.getMatchedCount());//獲取匹配計(jì)數(shù) System.out.println("獲取轉(zhuǎn)換后的Id"+updateResult.getUpsertedId());//獲取轉(zhuǎn)換后的Id }
文檔刪除操作
@Test //文檔刪除操作 void testRemove() { //刪除全部 // mongoTemplate.remove(new Query(),User.class); //條件刪除 DeleteResult remove = mongoTemplate.remove(Query.query(Criteria.where("name").is("張無(wú)忌")), User.class); System.out.println("獲取已刪除計(jì)數(shù)"+remove.getDeletedCount()); System.out.println(remove.wasAcknowledged()); } }
到此這篇關(guān)于SpringBoot操作Mongodb的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot操作Mongodb內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis-Plus實(shí)現(xiàn)邏輯刪除功能解析
這篇文章主要介紹了MyBatis-Plus實(shí)現(xiàn)邏輯刪除功能解析,有時(shí)候并不需要真正的刪除數(shù)據(jù),而是想邏輯刪除,方便數(shù)據(jù)恢復(fù),MyBatis-Plus可以很方便的實(shí)現(xiàn)邏輯刪除的功能,需要的朋友可以參考下2023-11-11Java與Node.js利用AES加密解密出相同結(jié)果的方法示例
這篇文章主要介紹了Java與Node.js利用AES加密解密出相同結(jié)果的方法,文中給出了詳細(xì)的示例代碼,相信對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,需要的朋友們下面來(lái)一起看看吧。2017-02-02SVN導(dǎo)入maven項(xiàng)目報(bào)錯(cuò)解決方案
這篇文章主要介紹了SVN導(dǎo)入maven項(xiàng)目報(bào)錯(cuò)解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12springboot?@Async?注解如何實(shí)現(xiàn)方法異步
這篇文章主要介紹了springboot?@Async?注解如何實(shí)現(xiàn)方法異步,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11如何基于mybatis框架查詢(xún)數(shù)據(jù)庫(kù)表數(shù)據(jù)并打印
這篇文章主要介紹了如何基于mybatis框架查詢(xún)數(shù)據(jù)庫(kù)表數(shù)據(jù)并打印,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Spring 框架中注入或替換方法實(shí)現(xiàn)
這篇文章主要介紹了Spring 框架中注入或替換方法實(shí)現(xiàn),非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05SpringBoot多數(shù)據(jù)源配置詳細(xì)教程(JdbcTemplate、mybatis)
這篇文章主要介紹了SpringBoot多數(shù)據(jù)源配置詳細(xì)教程(JdbcTemplate、mybatis),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Java 基于Spire.Cloud.SDK for Java在PDF中繪制形狀
這篇文章主要介紹了Java 基于Spire.Cloud.SDK for Java在PDF中繪制形狀,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07