spring-data-mongodb的增刪改查操作(MongoTemplate方式)


 


注: 此處的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" ]

更多MongoDB語法教程

   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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM