注: 此處的spring-data-mongodb架包是 1.8.0版本 ,更高版本的操作方法有 部分修改,具體可自行 查看源碼
(懂一個版本;再看源碼修改部分,很容易理解的)
1、所需架包
<!-- spring整合MongoDB --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>${spring.data.version}</version> </dependency>
2、注入MongoTemplate
在對應的 Dao層 注入 MongoTemplate
3、獲取集合
mongoTemplate.getCollection(mongoTemplate.getCollectionName(entityClass)).distinct(key, query.getQueryObject())
// entityClass:實體類,實際上就是實體類.class;如:User.class
// mongoTemplate.getCollectionName(entityClass):可獲取到entityClass實體類所對應的集合名稱
// mongoTemplate.getCollection(mongoTemplate.getCollectionName(entityClass)):可通過集合名稱獲取到對應集合
// mongoTemplate.getCollection(collectionName):返回的是基本的Driver集合對象,即DBCollection類型
// 因此使用 getCollection() 方法獲取到的集合類型,不是我們在開發過程中所使用的集合類型
// key:指定鍵值,實際上就是MongoDB數據庫集合中文檔的字段名
// query:查詢對象
// query.getQueryObject():獲取對應查詢對象的查詢條件
// .distinct(key, query.getQueryObject()):在單個集合或視圖,查詢滿足條件的所有文檔中,指定字段的不同值
.distinct(字段 , 查詢):在 單個 集合或視圖中查找指定字段的不同值,並返回 List 集合
如:有MongoDB中集合 inventory
{ "_id": 1, "dept": "A", "item": { "sku": "111", "color": "red" }, "sizes": [ "S", "M" ] }
{ "_id": 2, "dept": "A", "item": { "sku": "111", "color": "blue" }, "sizes": [ "M", "L" ] }
{ "_id": 3, "dept": "B", "item": { "sku": "222", "color": "blue" }, "sizes": [ "S" ] }
{ "_id": 4, "dept": "A", "item": { "sku": "333", "color": "black" }, "sizes": [ "S" ] }
mongoTemplate.getCollection("inventory").distinct("dept")
:從inventory集合中的所有文檔返回dept字段的不同值;結果為:[ "A", "B" ]
mongoTemplate.getCollection("inventory").distinct("item.sku")
:從inventory集合中的所有文檔返回sku嵌入字段的不同值;結果為:[ "111", "222", "333" ]
mongoTemplate.getCollection("inventory").distinct("sizes")
:從inventory集合中的所有文檔返回數組字段的不同值;結果為:[ "M", "S", "L" ]
mongoTemplate.getCollection("inventory").distinct("item.sku", { dept: "A" })
:從inventory集合中 dept字段等於A 的文檔中返回sku嵌入字段的不同值;結果為:[ "111", "333" ]
4、增加操作(插入)
可以一次性插入一個 對象集合 ,也可以單次插入 一個對象 ;需要插入的數據量大的時候,建議使用批量插入
List<SysUser> userList = new ArrayList<>();
userList.add(new SysUser(11,"1","白小飛","18888888888"));
userList.add(new SysUser(9,"1","白敬亭","13333333333"));
userList.add(new SysUser(5,"1","林宥嘉","14444444444"));
userList.add(new SysUser(6,"1","彭於晏","15555555555"));
userList.add(new SysUser(7,"1","周傑倫","16666666666"));
mongoTemplate.insert(userList, "userList"); // 第一個參數是要插入的數據(文檔),第二個參數是集合名稱;批量插入
SysUser sysUser = new SysUser(12,"1","黃小飛","18888888888");
mongoTemplate.insert(sysUser, "userList"); // 第一個參數是要插入的數據(文檔),第二個參數是要插入的mongo集合名
或者
SysUser sysUser = new SysUser(12,"1","黃小飛","18888888888");
mongoTemplate.save(sysUser); // 參數表示要保存的數據(文檔);save()方法只能用於單個對象保存,不可用於批量插入
注意: 同一個mongo集合中,前后插入的數據 對象類型要一致
實體類需要用注解標識:
@Document(collection = “xxx”):用於實體類上,表明這是一個MongoDB的文檔集合,相當於MySQL的數據表;其中collection表示集合名稱,不寫則默認為實體類名稱
@Id:用於實體類中的成員變量,表示主鍵標識
@Field(“xxx”):用於實體類中的成員變量,表示MongoDB文檔集合中的字段,其值對應集合的字段名稱
5、刪除操作
// 刪除author為yinjihuan的數據
Query query = Query.query(Criteria.where("author").is("yinjihuan"));
mongoTemplate.remove(query, Article.class);
// 也可直接指定MongoDB集合名稱
query = Query.query(Criteria.where("author").is("yinjihuan"));
mongoTemplate.remove(query, "article_info");
// 刪除集合,可傳實體類,也可以傳名稱
mongoTemplate.dropCollection(Article.class);
mongoTemplate.dropCollection("article_info");
// 刪除數據庫;在開發中,開發所使用的數據庫是在配置文件中配置的;使用這個方法即可直接刪除配置對應的數據庫
mongoTemplate.getDb().dropDatabase();
下面這2種 適合 知道要刪除幾條數據的場景
//查詢出符合條件的第一個結果,並將符合條件的數據刪除,只會刪除第一條
query = Query.query(Criteria.where("author").is("yinjihuan"));
Article article = mongoTemplate.findAndRemove(query, Article.class);
//查詢出符合條件的所有結果,並將符合條件的所有數據刪除
query = Query.query(Criteria.where("author").is("yinjihuan"));
List<Article> articles = mongoTemplate.findAllAndRemove(query, Article.class);
6、修改操作
准備要練習的數據2條,如下:
{
"_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);
// 修改后結果如下,我們會發現第一條數據的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);
// 修改后結果如下,我們會發現所有數據的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的數據,如果沒有author為jason的數據則以此條件創建一條新的數據
當沒有符合條件的文檔,就以這個條件和更新文檔為基礎創建一個新的文檔,如果找到匹配的文檔就正常的更新。
query = Query.query(Criteria.where("author").is("jason"));
update = Update.update("title", "MongoTemplate").set("visitCount", 10);
mongoTemplate.upsert(query, update, Article.class);
// 修改后結果如下,我們會發現新增了一條數據
{
"_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
}
更新條件不變,更新字段改成了一個我們集合中不存在的,用set方法如果更新的key不存在則創建一個新的key
query = Query.query(Criteria.where("author").is("jason"));
update = Update.update("title", "MongoTemplate").set("money", 100);
mongoTemplate.updateMulti(query, update, Article.class);
// 修改后結果如下,我們會發現新加了一個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);
// 修改后結果如下,我們會發現money變成200
{
"_id": ObjectId("57c6e1601e4735b2c306cdb7"),
"author": "jason",
"title": "MongoTemplate",
"visit_count": 10,
"money":200
}
update的rename方法用於修改key的名稱
query = Query.query(Criteria.where("author").is("jason"));
update = Update.update("title", "MongoTemplate").rename("visitCount", "vc");
mongoTemplate.updateMulti(query, update, Article.class);
// 修改結果如下,可以發現字段visitCount被修改成為了vc
{
"_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);
// 修改后結果如下,我們會發現vc這個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);
// 修改后結果如下,我們會發現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")
}
7、查詢操作
MongoDB的查詢方式很多種,下面只列了一些常用的,比如:
1、=查詢
2、模糊查詢
3、大於小於范圍查詢
4、in查詢
5、or查詢
6、查詢一條,查詢全部
根據作者查詢所有符合條件的數據,返回List
Query query = Query.query(Criteria.where("author").is("yinjihuan"));
List<Article> articles = mongoTemplate.find(query, Article.class);
只查詢符合條件的第一條數據,返回Article對象
query = Query.query(Criteria.where("author").is("yinjihuan"));
Article article = mongoTemplate.findOne(query, Article.class);
查詢集合中所有數據,不加條件
articles = mongoTemplate.findAll(Article.class);
查詢符合條件的數量
query = Query.query(Criteria.where("author").is("yinjihuan"));
long count = mongoTemplate.count(query, Article.class);
根據主鍵ID查詢
article = mongoTemplate.findById(new ObjectId("57c6e1601e4735b2c306cdb7"), Article.class);
in查詢
List<String> authors = Arrays.asList("yinjihuan", "jason");
query = Query.query(Criteria.where("author").in(authors));
articles = mongoTemplate.find(query, Article.class);
ne(!=)查詢
query = Query.query(Criteria.where("author").ne("yinjihuan"));
articles = mongoTemplate.find(query, Article.class);
lt(<)查詢訪問量小於10的文章
query = Query.query(Criteria.where("visitCount").lt(10));
articles = mongoTemplate.find(query, Article.class);
范圍查詢,大於5小於10
query = Query.query(Criteria.where("visitCount").gt(5).lt(10));
articles = mongoTemplate.find(query, Article.class);
模糊查詢,author中包含a的數據
query = Query.query(Criteria.where("author").regex("a"));
articles = mongoTemplate.find(query, Article.class);
數組查詢,查詢tags里數量為3的數據
query = Query.query(Criteria.where("tags").size(3));
articles = mongoTemplate.find(query, Article.class);
or查詢,查詢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);