- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- Spring Boot中快速操作Mongodb數據庫指南
在Spring Boot中集成Mongodb非常簡(jiǎn)單,只需要加入Mongodb的Starter包即可,代碼如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
然后配置Mongodb的連接信息:
spring.data.mongodb.uri=mongodb://192.168.0.13/test
完整配置信息請參考下面:
spring.data.mongodb.authentication-database= # Authentication database name. spring.data.mongodb.database= # Database name. spring.data.mongodb.field-naming-strategy= # Fully qualified name of the FieldNamingStrategy to use. spring.data.mongodb.grid-fs-database= # GridFS database name. spring.data.mongodb.host= # Mongo server host. Cannot be set with URI. spring.data.mongodb.password= # Login password of the mongo server. Cannot be set with URI. spring.data.mongodb.port= # Mongo server port. Cannot be set with URI. spring.data.mongodb.repositories.type=auto # Type of Mongo repositories to enable. spring.data.mongodb.uri=mongodb://localhost/test # Mongo database URI. Cannot be set with host, port and credentials. spring.data.mongodb.username= # Login user of the mongo server. Cannot be set with URI.
配置好了之后就直接可以注入MongoTemplate操作數據了
首先創(chuàng )建一個(gè)實(shí)體類(lèi),我們這邊用文章來(lái)做實(shí)體類(lèi),定義如下字段:
import java.util.Date; import java.util.List; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; /** * 文章信息 * @author yinjihuan * */ @Document(collection = "article_info") public class Article { @Id private String id; @Field("title") private String title; @Field("url") private String url; @Field("author") private String author; @Field("tags") private List<String> tags; @Field("visit_count") private Long visitCount; @Field("add_time") private Date addTime; //省略get set方法 }
實(shí)體類(lèi)中的注解解釋如下:
1.Document注解標識這是一個(gè)文檔,等同mysql中的表,collection值表示mongodb中集合的名稱(chēng),不寫(xiě)默認為實(shí)體類(lèi)名article。
2.Id注解為主鍵標識
3.Field注解為字段標識,指定值為字段名稱(chēng),這邊有個(gè)小技巧,之所有spring-data.mongodb中有這樣的注解,是為了能夠讓用戶(hù)自定義字段名稱(chēng),可以和實(shí)體類(lèi)不一致,還有個(gè)好處就是可以用縮寫(xiě),比如username我們可以配置成unane或者un,這樣的好處是節省了存儲空間,mongodb的存儲方式是key value形式的,每個(gè)key就會(huì )重復存儲,key其實(shí)就占了很大一份存儲空間。
接下來(lái)可以操作數據庫了,接著(zhù)上次,在測試類(lèi)里寫(xiě)代碼
@Autowired private MongoTemplate mongoTemplate; /** * 初始化文章信息 * @author yinjihuan */ public static void initArticle() { //循環(huán)添加 for (int i = 0; i < 10; i++) { Article article = new Article(); article.setTitle("MongoTemplate的基本使用"); article.setAuthor("yinjihuan"); article.setUrl("http://cxytiandi.com/blog/detail/" + i); article.setTags(Arrays.asList("java", "mongodb", "spring")); article.setVisitCount(0L); article.setAddTime(new Date()); mongoTemplate.save(article); } //批量添加 List<Article> articles = new ArrayList<>(10); for (int i = 0; i < 10; i++) { Article article = new Article(); article.setTitle("MongoTemplate的基本使用"); article.setAuthor("yinjihuan"); article.setUrl("http://cxytiandi.com/blog/detail/" + i); article.setTags(Arrays.asList("java", "mongodb", "spring")); article.setVisitCount(0L); article.setAddTime(new Date()); articles.add(article); } mongoTemplate.insert(articles, Article.class); }
在數據量大的情況下批量添加性能會(huì )更好哦。
刪除操作
//刪除author為yinjihuan的數據 Query query = Query.query(Criteria.where("author").is("yinjihuan")); mongoTemplate.remove(query, Article.class);
//如果實(shí)體類(lèi)中沒(méi)配集合名詞,可在刪除的時(shí)候單獨指定article_info query = Query.query(Criteria.where("author").is("yinjihuan")); mongoTemplate.remove(query, "article_info");
//刪除集合,可傳實(shí)體類(lèi),也可以傳名稱(chēng) mongoTemplate.dropCollection(Article.class); mongoTemplate.dropCollection("article_info");
//刪除數據庫 mongoTemplate.getDb().dropDatabase();
下面這2種適合要知道刪除的數據有哪些的場(chǎng)景,比如記錄刪除的記錄
//查詢(xún)出符合條件的第一個(gè)結果,并將符合條件的數據刪除,只會(huì )刪除第一條 query = Query.query(Criteria.where("author").is("yinjihuan")); Article article = mongoTemplate.findAndRemove(query, Article.class);
//查詢(xún)出符合條件的所有結果,并將符合條件的所有數據刪除 query = Query.query(Criteria.where("author").is("yinjihuan")); List<Article> articles = mongoTemplate.findAllAndRemove(query, Article.class);
首先初始化需要修改的數據
{ "_id": ObjectId("57c43caed4c63d7e39b5dc48"), "title": "MongoTemplate的基本使用", "url": "http://cxytiandi.com/blog/detail/0", "author": "yinjihuan", "tags": [ "java", "mongodb", "spring" ], "visit_count": 0, "add_time": ISODate("2016-08-29T13:46:21.881Z") } { "_id": ObjectId("57c43caed4c63d7e39b5dc49"), "title": "MongoTemplate的基本使用", "url": "http://cxytiandi.com/blog/detail/1", "author": "yinjihuan", "tags": [ "java", "mongodb", "spring" ], "visit_count": 0, "add_time": ISODate("2016-08-29T13:46:22.201Z") }
//修改第一條author為yinjihuan的數據中的title和visitCount Query query = Query.query(Criteria.where("author").is("yinjihuan")); Update update = Update.update("title", "MongoTemplate").set("visitCount", 10); mongoTemplate.updateFirst(query, update, Article.class);
修改后結果如下,我們會(huì )發(fā)現第一條數據的title還有visit_count被修改了
{ "_id": ObjectId("57c43caed4c63d7e39b5dc48"), "title": "MongoTemplate", "url": "http://cxytiandi.com/blog/detail/0", "author": "yinjihuan", "tags": [ "java", "mongodb", "spring" ], "visit_count": 10, "add_time": ISODate("2016-08-29T13:46:21.881Z") } { "_id": ObjectId("57c43caed4c63d7e39b5dc49"), "title": "MongoTemplate的基本使用", "url": "http://cxytiandi.com/blog/detail/1", "author": "yinjihuan", "tags": [ "java", "mongodb", "spring" ], "visit_count": 0, "add_time": ISODate("2016-08-29T13:46:22.201Z") }
//修改全部符合條件的 query = Query.query(Criteria.where("author").is("yinjihuan")); update = Update.update("title", "MongoTemplate").set("visitCount", 10); mongoTemplate.updateMulti(query, update, Article.class);
修改后結果如下,我們會(huì )發(fā)現所有數據的title還有visit_count被修改了
{ "_id": ObjectId("57c43caed4c63d7e39b5dc48"), "title": "MongoTemplate", "url": "http://cxytiandi.com/blog/detail/0", "author": "yinjihuan", "tags": [ "java", "mongodb", "spring" ], "visit_count": 10, "add_time": ISODate("2016-08-29T13:46:21.881Z") } { "_id": ObjectId("57c43caed4c63d7e39b5dc49"), "title": "MongoTemplate", "url": "http://cxytiandi.com/blog/detail/1", "author": "yinjihuan", "tags": [ "java", "mongodb", "spring" ], "visit_count": 10, "add_time": ISODate("2016-08-29T13:46:22.201Z") }
//特殊更新,更新author為jason的數據,如果沒(méi)有author為jason的數據則以此條件創(chuàng )建一條新的數據 //當沒(méi)有符合條件的文檔,就以這個(gè)條件和更新文檔為基礎創(chuàng )建一個(gè)新的文檔,如果找到匹配的文檔就正常的更新。 query = Query.query(Criteria.where("author").is("jason")); update = Update.update("title", "MongoTemplate").set("visitCount", 10); mongoTemplate.upsert(query, update, Article.class);
修改后結果如下,我們會(huì )發(fā)現新增了一條數據
{ "_id": ObjectId("57c43caed4c63d7e39b5dc48"), "title": "MongoTemplate", "url": "http://cxytiandi.com/blog/detail/0", "author": "yinjihuan", "tags": [ "java", "mongodb", "spring" ], "visit_count": 10, "add_time": ISODate("2016-08-29T13:46:21.881Z") } { "_id": ObjectId("57c43caed4c63d7e39b5dc49"), "title": "MongoTemplate", "url": "http://cxytiandi.com/blog/detail/1", "author": "yinjihuan", "tags": [ "java", "mongodb", "spring" ], "visit_count": 10, "add_time": ISODate("2016-08-29T13:46:22.201Z") } { "_id": ObjectId("57c6e1601e4735b2c306cdb7"), "author": "jason", "title": "MongoTemplate", "visit_count": 10 }
//更新條件不變,更新字段改成了一個(gè)我們集合中不存在的,用set方法如果更新的key不存在則創(chuàng )建一個(gè)新的key query = Query.query(Criteria.where("author").is("jason")); update = Update.update("title", "MongoTemplate").set("money", 100); mongoTemplate.updateMulti(query, update, Article.class);
修改后結果如下,我們會(huì )發(fā)現新加了一個(gè)key
{ "_id": ObjectId("57c6e1601e4735b2c306cdb7"), "author": "jason", "title": "MongoTemplate", "visit_count": 10, "money":100 }
//update的inc方法用于做累加操作,將money在之前的基礎上加上100 query = Query.query(Criteria.where("author").is("jason")); update = Update.update("title", "MongoTemplate").inc("money", 100); mongoTemplate.updateMulti(query, update, Article.class);
修改后結果如下,我們會(huì )發(fā)現money變成200
{ "_id": ObjectId("57c6e1601e4735b2c306cdb7"), "author": "jason", "title": "MongoTemplate", "visit_count": 10, "money":200 }
//update的rename方法用于修改key的名稱(chēng) query = Query.query(Criteria.where("author").is("jason")); update = Update.update("title", "MongoTemplate").rename("visitCount", "vc"); mongoTemplate.updateMulti(query, update, Article.class);
{ "_id": ObjectId("57c6e1601e4735b2c306cdb7"), "author": "jason", "title": "MongoTemplate", "vc": 10, "money":200 }
//update的unset方法用于刪除key query = Query.query(Criteria.where("author").is("jason")); update = Update.update("title", "MongoTemplate").unset("vc"); mongoTemplate.updateMulti(query, update, Article.class);
修改后結果如下,我們會(huì )發(fā)現vc這個(gè)key被刪除了
{ "_id": ObjectId("57c6e1601e4735b2c306cdb7"), "author": "jason", "title": "MongoTemplate", "money":200 }
//update的pull方法用于刪除tags數組中的java query = Query.query(Criteria.where("author").is("yinjihuan")); update = Update.update("title", "MongoTemplate").pull("tags", "java"); mongoTemplate.updateMulti(query, update, Article.class);
修改后結果如下,我們會(huì )發(fā)現tags里的java被刪除了
{ "_id": ObjectId("57c43caed4c63d7e39b5dc48"), "title": "MongoTemplate", "url": "http://cxytiandi.com/blog/detail/0", "author": "yinjihuan", "tags": [ "mongodb", "spring" ], "visit_count": 10, "add_time": ISODate("2016-08-29T13:46:21.881Z") } { "_id": ObjectId("57c43caed4c63d7e39b5dc49"), "title": "MongoTemplate", "url": "http://cxytiandi.com/blog/detail/1", "author": "yinjihuan", "tags": [ "mongodb", "spring" ], "visit_count": 10, "add_time": ISODate("2016-08-29T13:46:22.201Z") }
查詢(xún),無(wú)論是關(guān)系型數據庫還是mongodb這種nosql,都是使用比較多的,大部分操作都是讀的操作。
mongodb的查詢(xún)方式很多種,下面只列了一些常用的,比如:
1.=查詢(xún)
2.模糊查詢(xún)
3.大于小于范圍查詢(xún)
4.in查詢(xún)
5.or查詢(xún)
6.查詢(xún)一條,查詢(xún)全部
7.自己慢慢學(xué)習...
根據作者查詢(xún)所有符合條件的數據,返回List
Query query = Query.query(Criteria.where("author").is("yinjihuan")); List<Article> articles = mongoTemplate.find(query, Article.class);
只查詢(xún)符合條件的第一條數據,返回Article對象
query = Query.query(Criteria.where("author").is("yinjihuan")); Article article = mongoTemplate.findOne(query, Article.class);
查詢(xún)集合中所有數據,不加條件
articles = mongoTemplate.findAll(Article.class);
查詢(xún)符合條件的數量
query = Query.query(Criteria.where("author").is("yinjihuan")); long count = mongoTemplate.count(query, Article.class);
根據主鍵ID查詢(xún)
article = mongoTemplate.findById(new ObjectId("57c6e1601e4735b2c306cdb7"), Article.class);
in查詢(xún)
List<String> authors = Arrays.asList("yinjihuan", "jason"); query = Query.query(Criteria.where("author").in(authors)); articles = mongoTemplate.find(query, Article.class);
ne(!=)查詢(xún)
query = Query.query(Criteria.where("author").ne("yinjihuan")); articles = mongoTemplate.find(query, Article.class);
lt(<)查詢(xún)訪(fǎng)問(wèn)量小于10的文章
query = Query.query(Criteria.where("visitCount").lt(10)); articles = mongoTemplate.find(query, Article.class);
范圍查詢(xún),大于5小于10
query = Query.query(Criteria.where("visitCount").gt(5).lt(10)); articles = mongoTemplate.find(query, Article.class);
模糊查詢(xún),author中包含a的數據
query = Query.query(Criteria.where("author").regex("a")); articles = mongoTemplate.find(query, Article.class);
數組查詢(xún),查詢(xún)tags里數量為3的數據
query = Query.query(Criteria.where("tags").size(3)); articles = mongoTemplate.find(query, Article.class);
or查詢(xún),查詢(xún)author=jason的或者visitCount=0的數據
query = Query.query(Criteria.where("").orOperator( Criteria.where("author").is("jason"), Criteria.where("visitCount").is(0))); articles = mongoTemplate.find(query, Article.class);
到此這篇關(guān)于Spring Boot中如何快速操作Mongodb的文章就介紹到這了,更多相關(guān)SpringBoot操作Mongodb內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站