本篇博文為mongodb的curd中一篇,前面介紹簡單的查詢使用,這一篇重點則放在插入資料;
I. 基本使用
首先是準備好基本環境,可以參考博文
1. 新增一條資料
MongoDB一個基本資料稱為document,和mysql不一樣,沒有強制約束哪些欄位,可以隨意的插入,下面是一個簡單的插入演示
private static final String COLLECTION_NAME = "demo";
@Autowired
private MongoTemplate mongoTemplate;
/**
* 新增一條記錄
*/
public void insert() {
JSONObject object = new JSONObject();
object.put("name", "一灰灰blog");
object.put("desc", "歡迎關注一灰灰Blog");
object.put("age", 28);
// 插入一條document
mongoTemplate.insert(object, COLLECTION_NAME);
JSONObject ans = mongoTemplate
.findOne(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(28)), JSONObject.class,
COLLECTION_NAME);
System.out.println(ans);
}
複製程式碼
使用的關鍵地方為一行: mongoTemplate.insert(object, COLLECTION_NAME);
- 第一個引數為待插入的document
- 第二個引數為collection name (相當於mysql的table)
執行後輸出結果為如下
{"name":"一灰灰blog","_id":{"counter":12472353,"date":1548333180000,"machineIdentifier":14006254,"processIdentifier":17244,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":28,"desc":"歡迎關注一灰灰Blog"}
複製程式碼
2. 批量插入
一次插入多條記錄,傳集合進去即可
/**
* 批量插入
*/
public void insertMany() {
List<Map<String, Object>> records = new ArrayList<>();
for (int i = 0; i < 3; i++) {
Map<String, Object> record = new HashMap<>(4);
record.put("wechart", "一灰灰blog");
record.put("blog", Arrays.asList("http://spring.hhui.top", "http://blog.hhui.top"));
record.put("nums", 210);
record.put("t_id", i);
records.add(record);
}
// 批量插入文件
mongoTemplate.insert(records, COLLECTION_NAME);
// 查詢插入的內容
List<Map> result =
mongoTemplate.find(new Query(Criteria.where("wechart").is("一灰灰blog")), Map.class, COLLECTION_NAME);
System.out.println("Query Insert Records: " + result);
}
複製程式碼
返回結果如下:
Query Insert Records: [{t_id=0, wechart=一灰灰blog, _id=5c49b07cd5b7ee435cbe5022, blog=[http://spring.hhui.top, http://blog.hhui.top], nums=210}, {t_id=1, wechart=一灰灰blog, _id=5c49b07cd5b7ee435cbe5023, blog=[http://spring.hhui.top, http://blog.hhui.top], nums=210}, {t_id=2, wechart=一灰灰blog, _id=5c49b07cd5b7ee435cbe5024, blog=[http://spring.hhui.top, http://blog.hhui.top], nums=210}]
複製程式碼
3. upsert,不存在才插入
我們希望在插入之前,判斷資料是否存在,如果不存在則插入;如果存在則更新;此時就可以採用upsert來使用,一般三個引數
mongoTemplate.upsert(Query query, Update update, String collectionName)
複製程式碼
第一個為查詢條件,第二個為需要更新的欄位,最後一個指定對應的collection,一個簡單的例項如下
/**
* 資料不存在,通過 upsert 新插入一條資料
*
* set 表示修改key對應的value
* addToSet 表示在陣列中新增一條
*/
public void upsertNoMatch() {
// addToSet 表示將資料塞入document的一個陣列成員中
UpdateResult upResult = mongoTemplate.upsert(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(100)),
new Update().set("age", 120).addToSet("add", "額外增加"), COLLECTION_NAME);
System.out.println("nomatch upsert return: " + upResult);
List<JSONObject> re = mongoTemplate
.find(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(120)), JSONObject.class,
COLLECTION_NAME);
System.out.println("after upsert return should not be null: " + re);
System.out.println("------------------------------------------");
}
複製程式碼
輸出結果如下:
nomatch upsert return: AcknowledgedUpdateResult{matchedCount=0, modifiedCount=0, upsertedId=BsonObjectId{value=5c49b07ce6652f7e1add1ea2}}
after upsert return should not be null: [{"add":["額外增加"],"name":"一灰灰blog","_id":{"counter":14491298,"date":1548333180000,"machineIdentifier":15099183,"processIdentifier":32282,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":120}]
------------------------------------------
複製程式碼
4. upsert,存在則更新
前面的demo是演示不存在,那麼存在資料呢?
/**
* 只有一條資料匹配,upsert 即表示更新
*/
public void upsertOneMatch() {
// 資料存在,使用更新
UpdateResult result = mongoTemplate.upsert(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(120)),
new Update().set("age", 100), COLLECTION_NAME);
System.out.println("one match upsert return: " + result);
List<JSONObject> ans = mongoTemplate
.find(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(100)), JSONObject.class,
COLLECTION_NAME);
System.out.println("after update return should be one: " + ans);
System.out.println("------------------------------------------");
}
複製程式碼
輸出結果如下,注意下面的輸出資料的 _id
,正視前面插入的那條資料,兩個資料唯一的不同,就是age被修改了
one match upsert return: AcknowledgedUpdateResult{matchedCount=1, modifiedCount=1, upsertedId=null}
after update return should be null: [{"add":["額外增加"],"name":"一灰灰blog","_id":{"counter":14491298,"date":1548333180000,"machineIdentifier":15099183,"processIdentifier":32282,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":100}]
複製程式碼
5. upsert,多條滿足時
如果query條件命中多條資料,怎麼辦?會修改幾條資料呢?
/**
* 兩條資料匹配時,upsert 將只會更新一條資料
*/
public void upsertTwoMatch() {
// 多條資料滿足條件時,只會修改一條資料
System.out.println("------------------------------------------");
List<JSONObject> re = mongoTemplate
.find(new Query(Criteria.where("name").is("一灰灰blog").and("age").in(Arrays.asList(28, 100))),
JSONObject.class, COLLECTION_NAME);
System.out.println("original record: " + re);
UpdateResult result = mongoTemplate
.upsert(new Query(Criteria.where("name").is("一灰灰blog").and("age").in(Arrays.asList(28, 100))),
new Update().set("age", 120), COLLECTION_NAME);
System.out.println("two match upsert return: " + result);
re = mongoTemplate.find(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(120)), JSONObject.class,
COLLECTION_NAME);
System.out.println("after upsert return size should be 1: " + re);
System.out.println("------------------------------------------");
}
複製程式碼
根據實際輸出進行檢視,發現只有一條資料被修改;另外一條保持不變,結果如下
------------------------------------------
original record: [{"name":"一灰灰blog","_id":{"counter":12472353,"date":1548333180000,"machineIdentifier":14006254,"processIdentifier":17244,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":28,"desc":"歡迎關注一灰灰Blog"}, {"add":["額外增加"],"name":"一灰灰blog","_id":{"counter":14491298,"date":1548333180000,"machineIdentifier":15099183,"processIdentifier":32282,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":100}]
two match upsert return: AcknowledgedUpdateResult{matchedCount=1, modifiedCount=1, upsertedId=null}
after upsert return size should be 1: [{"name":"一灰灰blog","_id":{"counter":12472353,"date":1548333180000,"machineIdentifier":14006254,"processIdentifier":17244,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":120,"desc":"歡迎關注一灰灰Blog"}]
------------------------------------------
複製程式碼
II. 其他
0. 專案
- 工程:spring-boot-demo
- module: mongo-template
相關博文
1. 一灰灰Blog
- 一灰灰Blog個人部落格 blog.hhui.top
- 一灰灰Blog-Spring專題部落格 spring.hhui.top
一灰灰的個人部落格,記錄所有學習和工作中的博文,歡迎大家前去逛逛
2. 宣告
盡信書則不如,以上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840
3. 掃描關注
一灰灰blog
知識星球