Spring Boot中快速操作Mongodb數(shù)據(jù)庫(kù)指南
前言
在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
完整配置信息請(qǐng)參考下面:
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操作數(shù)據(jù)了
添加數(shù)據(jù)
首先創(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注解標(biāo)識(shí)這是一個(gè)文檔,等同mysql中的表,collection值表示mongodb中集合的名稱(chēng),不寫(xiě)默認(rèn)為實(shí)體類(lèi)名article。
2.Id注解為主鍵標(biāo)識(shí)
3.Field注解為字段標(biāo)識(shí),指定值為字段名稱(chēng),這邊有個(gè)小技巧,之所有spring-data.mongodb中有這樣的注解,是為了能夠讓用戶(hù)自定義字段名稱(chēng),可以和實(shí)體類(lèi)不一致,還有個(gè)好處就是可以用縮寫(xiě),比如username我們可以配置成unane或者un,這樣的好處是節(jié)省了存儲(chǔ)空間,mongodb的存儲(chǔ)方式是key value形式的,每個(gè)key就會(huì)重復(fù)存儲(chǔ),key其實(shí)就占了很大一份存儲(chǔ)空間。
接下來(lái)可以操作數(shù)據(jù)庫(kù)了,接著上次,在測(cè)試類(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);
}
在數(shù)據(jù)量大的情況下批量添加性能會(huì)更好哦。
刪除操作
//刪除author為yinjihuan的數(shù)據(jù)
Query query = Query.query(Criteria.where("author").is("yinjihuan"));
mongoTemplate.remove(query, Article.class);
//如果實(shí)體類(lèi)中沒(méi)配集合名詞,可在刪除的時(shí)候單獨(dú)指定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");
//刪除數(shù)據(jù)庫(kù) mongoTemplate.getDb().dropDatabase();
下面這2種適合要知道刪除的數(shù)據(jù)有哪些的場(chǎng)景,比如記錄刪除的記錄
//查詢(xún)出符合條件的第一個(gè)結(jié)果,并將符合條件的數(shù)據(jù)刪除,只會(huì)刪除第一條
query = Query.query(Criteria.where("author").is("yinjihuan"));
Article article = mongoTemplate.findAndRemove(query, Article.class);
//查詢(xún)出符合條件的所有結(jié)果,并將符合條件的所有數(shù)據(jù)刪除
query = Query.query(Criteria.where("author").is("yinjihuan"));
List<Article> articles = mongoTemplate.findAllAndRemove(query, Article.class);
修改操作
首先初始化需要修改的數(shù)據(jù)
{
"_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的數(shù)據(jù)中的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);
修改后結(jié)果如下,我們會(huì)發(fā)現(xiàn)第一條數(shù)據(jù)的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);
修改后結(jié)果如下,我們會(huì)發(fā)現(xiàn)所有數(shù)據(jù)的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的數(shù)據(jù),如果沒(méi)有author為jason的數(shù)據(jù)則以此條件創(chuàng)建一條新的數(shù)據(jù)
//當(dāng)沒(méi)有符合條件的文檔,就以這個(gè)條件和更新文檔為基礎(chǔ)創(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);
修改后結(jié)果如下,我們會(huì)發(fā)現(xiàn)新增了一條數(shù)據(jù)
{
"_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);
修改后結(jié)果如下,我們會(huì)發(fā)現(xiàn)新加了一個(gè)key
{
"_id": ObjectId("57c6e1601e4735b2c306cdb7"),
"author": "jason",
"title": "MongoTemplate",
"visit_count": 10,
"money":100
}
//update的inc方法用于做累加操作,將money在之前的基礎(chǔ)上加上100
query = Query.query(Criteria.where("author").is("jason"));
update = Update.update("title", "MongoTemplate").inc("money", 100);
mongoTemplate.updateMulti(query, update, Article.class);
修改后結(jié)果如下,我們會(huì)發(fā)現(xiàn)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);
修改后結(jié)果如下,我們會(huì)發(fā)現(xiàn)vc這個(gè)key被刪除了
{
"_id": ObjectId("57c6e1601e4735b2c306cdb7"),
"author": "jason",
"title": "MongoTemplate",
"money":200
}
//update的pull方法用于刪除tags數(shù)組中的java
query = Query.query(Criteria.where("author").is("yinjihuan"));
update = Update.update("title", "MongoTemplate").pull("tags", "java");
mongoTemplate.updateMulti(query, update, Article.class);
修改后結(jié)果如下,我們會(huì)發(fā)現(xiàn)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)操作
查詢(xún),無(wú)論是關(guān)系型數(shù)據(jù)庫(kù)還是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)?nèi)?/p>
7.自己慢慢學(xué)習(xí)...
根據(jù)作者查詢(xún)所有符合條件的數(shù)據(jù),返回List
Query query = Query.query(Criteria.where("author").is("yinjihuan"));
List<Article> articles = mongoTemplate.find(query, Article.class);
只查詢(xún)符合條件的第一條數(shù)據(jù),返回Article對(duì)象
query = Query.query(Criteria.where("author").is("yinjihuan"));
Article article = mongoTemplate.findOne(query, Article.class);
查詢(xún)集合中所有數(shù)據(jù),不加條件
articles = mongoTemplate.findAll(Article.class);
查詢(xún)符合條件的數(shù)量
query = Query.query(Criteria.where("author").is("yinjihuan"));
long count = mongoTemplate.count(query, Article.class);
根據(jù)主鍵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)?cè)L問(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的數(shù)據(jù)
query = Query.query(Criteria.where("author").regex("a"));
articles = mongoTemplate.find(query, Article.class);
數(shù)組查詢(xún),查詢(xún)tags里數(shù)量為3的數(shù)據(jù)
query = Query.query(Criteria.where("tags").size(3));
articles = mongoTemplate.find(query, Article.class);
or查詢(xún),查詢(xún)author=jason的或者visitCount=0的數(shù)據(jù)
query = Query.query(Criteria.where("").orOperator(
Criteria.where("author").is("jason"),
Criteria.where("visitCount").is(0)));
articles = mongoTemplate.find(query, Article.class);
總結(jié)
到此這篇關(guān)于Spring Boot中如何快速操作Mongodb的文章就介紹到這了,更多相關(guān)SpringBoot操作Mongodb內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中Arrays.sort自定義一維數(shù)組、二維數(shù)組的排序方式
這篇文章主要介紹了Java中Arrays.sort自定義一維數(shù)組、二維數(shù)組的排序方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
如何利用postman完成JSON串的發(fā)送功能(springboot)
這篇文章主要介紹了如何利用postman完成JSON串的發(fā)送功能(springboot),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Mybatis通過(guò)數(shù)據(jù)庫(kù)表自動(dòng)生成實(shí)體類(lèi)和xml映射文件
這篇文章主要介紹了Mybatis通過(guò)數(shù)據(jù)庫(kù)表自動(dòng)生成實(shí)體類(lèi)和xml映射文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
java JVM原理與常識(shí)知識(shí)點(diǎn)
在本文中小編給大家分享的是關(guān)于java的JVM原理和java常識(shí),有興趣的朋友們可以學(xué)習(xí)下2018-12-12
解決Spring調(diào)用Feign報(bào)錯(cuò):java.io.IOException:Incomplete output
這篇文章主要介紹了解決Spring調(diào)用Feign報(bào)錯(cuò):java.io.IOException:Incomplete output stream問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
使用Spark?SQL實(shí)現(xiàn)讀取不帶表頭的txt文件
這篇文章主要為大家詳細(xì)介紹了如何使用Spark?SQL實(shí)現(xiàn)讀取不帶表頭的txt文件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
使用JDBC4.0操作XML類(lèi)型的字段(保存獲取xml數(shù)據(jù))的方法
jdbc4.0最重要的特征是支持xml數(shù)據(jù)類(lèi)型,接下來(lái)通過(guò)本文重點(diǎn)給大家介紹如何使用jdbc4.0操作xml類(lèi)型的字段,對(duì)jdbc4.0 xml相關(guān)知識(shí)感興趣的朋友一起看下吧2016-08-08

