一.概述
? ? ? ? 本篇文章介紹在Navicat中對MongoDB數據庫進行增刪改查操作,在后面會介紹在Spring Boot中使用MongoTemplate對MongoDB數據庫進行相關操作.如有必要可以先看看前面幾篇文章.
MongoDB:MySQL,Redis,ES,MongoDB的應用場景
MongoDB:數據庫初步應用
二.在Navicat進行增刪改查操作
2.1 新增數據
MongoDB有以下幾種方法對數據進行新增.
1) insert() 插入單個或者多個數據(文檔);
2) save() 如果新新增數據主鍵存在那么就修改,如果不存在就新增.
3) insertOne()新增一條數據
4) insertMany()新增多條數據.
其中insertOne,insertMany與insert()的功能重復,所以這里就不多做介紹了.
2.1.1 insert()新增數據
示例代碼如下:
db.user_search_record.insert({uuid:"c5e41a77a87c776c7cdbe521294ddcf6",keyword:"剪紙用品",time:ISODate(),userId:"0f6bea039ca64c9e81c7bdb43f1587ca"}
)
對照語法格式如下:
db.集合名稱.insert(JSON格式的鍵值對
)
這里需要主要的是db不能省略,不然會提示集合(表)名稱未定義.
在上面案例中ISODate()獲得的是格林威治時間,需要在上面+8才能獲得北京時間,時間格式時候yyyy-MM-dd HH:mm:ss?
下面代碼添加多條記錄,多條記錄需要用 [ ] 符號,表示是一個數組.
db.user_search_record.insert([
{uuid:"c5e41a77a87c776c7cdbe521294ddcf6",keyword:"日用商品",time:ISODate(),userId:"0f6bea039ca64c9e81c7bdb43f1587ca"},
{uuid:"c5e41a77a87c776c7cdbe521294ddcf6",keyword:"食品",time:ISODate(),userId:"0f6bea039ca64c9e81c7bdb43f1587ca"},
])
在MongoDB的集合中存在_id字段,作為文檔的主鍵,如果沒有指定,會自動生成.?
2.1.2 使用save()保存文檔
save()的語法格式與insert()格式類似,示例代碼如下:
db.user_search_record.save({uuid:"c5e41a77a87c776c7cdbe521294ddcf6",keyword:"現切水果",time:ISODate(),userId:"0f6bea039ca64c9e81c7bdb43f1587ca"}
)
上面代碼沒有指定_id所以等同于insert(),將新增一條代碼.如果我們指定_id,將判斷_id是否存在,如果存在那么就修改原數據,如果不存在,那么新增,示例代碼如下:
db.user_search_record.save({_id:ObjectId("64dc2cc9045b0000260056f5"),uuid:"c5e41a77a87c776c7cdbe521294ddcf6",keyword:"綠葉水果",time:ISODate(),userId:"0f6bea039ca64c9e81c7bdb43f1587ca"}
)
?在上面代碼中需要注意_id是MongoDB特有的數據類型:ObjectId,所以需要用到ObjectId()這個方法對字符串進行轉換,并且不能省略.如果上面的_id存在將對數據進行修改,如果不存在那么將新增.
?與insert()不同的是save()一次只能操作一條數據.
2.2 更新數據
? ? ? ? 更新數據常見的方法有update(),save(),updateOne(),updateMany(),replaceOne().其中save在上面已經介紹了,
2.2.1?update()更新數據
下面代碼使用update方法更新數據
db.product_detail.update(
{_id:ObjectId("64db394fd5b10c163f4ce01d")},
{$set:{title:"正宗山東煙臺紅富士又紅又甜 順豐包郵"}}
)
其語法格式如下:
db.product_detail.update(
{查詢條件},
{$set:更新字段}
)
在上面的更新中,默認只會更新匹配到的第一條語句,如果需要更新所有匹配到的語句需要設置multi為true,這個值默認為false(不進行多條語句更新),示例如下面的代碼將更新多條匹配的語句:
db.product_detail.update(
{title:"享受正宗的新疆李子美味"},
{$set:{title:"正宗的新疆李子順豐包郵到家 皮薄美味豐富維C"}},
{multi:true}
)
2.2.2 其它更新語法介紹
? ? ? ? ?其它更新語法不常用,只做簡單介紹,updateOne()只更新匹配到的第一條語句,updateMany()更新多條語句,reaplaceOne()只更新匹配到的第一條語句.
2.3 刪除數據
? ? ? ? MongoDB中刪除也有多種方法:remove(),deleteOne(),deleteMany(),最常用的是remove()方法.
2.3.1 remove()方法刪除數據
remove的語法與update語法有相似之處,示例代碼如下:
db.user_search_record.remove(
{_id:ObjectId("64db3bf7d5b10c163f5469d5")},
{justOne:true}
)
其語法格式如下:
db.集合名稱.remove(
{篩選條件},
{可選參數}
)
在上面的代碼中justOne:true表示只刪除一條數據,這個值默認為false,也就是會刪除所有匹配到的數據.在做刪除之前最好先根據刪除條件做一次查詢,避免被誤刪.
2.3.3 其它刪除方法
?deleteOne()一次刪除一個文檔
?deleteMany()一次刪除多條匹配到的文檔.
上面這兩個方法都可以用remove()代替.
2.4 基本查詢
任何數據庫中查詢是所有操作中最重要和常用的環節,我們需要從以下幾個方面逐步了解
2.4.1 比較操作符
在前面的操作中,我們已經發現了mongoDB以$作為關鍵字的標志,這查詢中也是一樣.
$eq : 查詢相等
$ne: 查詢不相等
$gt, $gte: 查詢大于,大于等于條件的文檔
$lt, $lte : 查詢小于, 小于等于條件的文檔
$in, $nin: 查詢條件必須是數組, 查詢存在或者不存在這個數組里面值的文檔.
2.4.2 邏輯操作符
$and : 用于多條件查詢,表示并且
$or : 用于多條件查詢,表示或
$nor : 用于多條件查詢,表示查詢文檔必須不符合所有條件
$not : 只能用于一個條件查詢,表示文檔不符合查詢條件.
2.4.3 元素操作符
$exists: 判斷指定字段是否存在.
$type: 判斷指定字段的數據類型
使用find()方法進行查詢,案例如下:
db.product_detail.find({$and:[ //and中列出了三個條件必須都要滿足{categoryId:{$eq:32}}, {productRating:{$gte:4.9}}, {shopId:{$not:{$eq:"4d3f317917543ab3c1ebed6300453f69"}}}],$or:[ //or列出了兩個條件,必須滿足其中一個{positiveReviews:{$gte:300}}, {badReviews:{$lt:10}}]}
)
find方法接受一個json數據,其中$and和$or作為數據中的兩個屬性,這兩個屬性可以接受數組作為屬性值.?
2.4.4 模糊查詢
在mongoDB中,模糊查詢是采用的正則表達式的方式,例如下面的代碼:
db.product_detail.find({$and:[{address:"深圳"},{productRating:{$gte:4.5}},{title:{$regex:"西瓜",$options:["i","x","s"]} }]}
)
$regex:"西 瓜" 是指定title字段需要模糊匹配西瓜這兩個字.
$options:是設置可選參數, i表示忽略大小寫,x表示忽略空格,s表示忽略換行.
三.Spring Boot 對MongoDB進行增刪改查
先引用mongoTemplate
@Resource
private MongoTemplate mongoTemplate; //mongoDB操作模板
3.1 新增文檔
/*** 添加用戶的收貨地址* @param userAddress* @return 返回主鍵*/@Overridepublic String addAddress(UserAddress userAddress){//向集合中添加數據,如果沒有指定_id,那么會自動生成userAddress = mongoTemplate.insert(userAddress);//返回生成的uidreturn userAddress.get_id();}
3.2 更新文檔
/*** 更新用戶的收貨地址* @param userAddress* @return*/@Overridepublic boolean updateAddress(UserAddress userAddress){//創建查詢對象Query query = new Query();//根據主鍵創建查詢語句query.addCriteria(Criteria.where("_id").is(userAddress.get_id()));//創建更新對象Update update = new Update();//根據鍵值對添加更新數據update.set("address",userAddress.getAddress());update.set("province",userAddress.getProvince());update.set("tel",userAddress.getTel());update.set("city",userAddress.getCity());update.set("recipient",userAddress.getRecipient());update.set("isDefault",userAddress.getIsDefault());//將檢索出來的對象進行更新UpdateResult result = mongoTemplate.updateFirst(query,update,UserAddress.class);//判斷被修改的文檔數據量if(result.getModifiedCount()>0){return true;}else{return false;}}
3.3 刪除文檔
/*** 根據主鍵編號移除用戶的收貨地址:實際操作為將用戶的收貨地址的isDelete值改為true(1)* @param id* @return true:成功*/@Overridepublic boolean removeAddress(String id){//創建查詢標準Query query = new Query();query.addCriteria(Criteria.where("_id").is(id));//將數據的isDeleted字段改為trueUpdate update = new Update();update.set("isDeleted",Byte.valueOf("1"));UpdateResult result = mongoTemplate.updateFirst(query,update,UserAddress.class);if(result.getModifiedCount()>0){return true;}else{return false;}}
3.4 查詢文檔
/*** 根據用戶id查詢這個用戶的所有收貨地址* @param uid 用戶id* @return 收貨地址集合*/@Overridepublic List<UserAddress> getAddressByUserId(String uid) {//創建查詢對象Query query = new Query();//配置查詢標準query.addCriteria(Criteria.where("userId").is(uid));List<UserAddress> list = mongoTemplate.find(query,UserAddress.class);return list;}/*** 根據主鍵編號查詢收貨地址* @param id* @return*/@Overridepublic UserAddress getAddressById(String id){//創建查詢標準Query query = new Query();query.addCriteria(Criteria.where("_id").is(id));//根據主鍵查詢值需要返回一個對象UserAddress userAddress = mongoTemplate.findOne(query,UserAddress.class);return userAddress;}