零基礎學習MongoDB(五)—— 文檔CRUD操作丨【綻放吧!數據庫】
一、插入數據
1.1 插入單條文檔
語法格式:db.collectionName.insert(文檔)
db是當前操作的數據庫
collectionName是操作的集合,沒有會自動創建
插入的文檔如果沒有_id屬性,會自動創建
例如在user集合下插入單個文檔
db.user.insert({name:"ljc",love:["soccer","music"]})
在可視化工具中實操的結果,在命令行中結果一致!
在 MongoDB3.2 之后的版本中,提供了 insertOne()函數用于插入文檔,同時廢棄了save函數,因此就不學習它了,它的使用方法和insert相同
語法格式:db.COLLECTION_NAME.insertOne(document)
例如在user集合下插入單個文檔
db.user.insertOne({name:"ddd",love:["play game","running"]})
在可視化工具中實操的結果,在命令行中結果一致!
1.2 插入多條文檔
向集合中批量插入多個文檔時,需要使用數組來存放文檔
語法格式:db.COLLECTION_NAME.insert([{},{},{}…])
例如采用insert在user中批量插入人員信息
db.user.insert([{name:"張三",age:"18"},{name:"李四",age:"19"}])
語法格式:db.COLLECTION_NAME.insertMany([{},{},{}…])
例如采用insertMany在user中批量插入人員信息
db.user.insertMany([{name:"王五",age:"28"},{name:"唐六",age:"29"}])
1.3 tips
db.COLLECTION_NAME.insertOne(document) db.COLLECTION_NAME.insertMany(document) db.COLLECTION_NAME.replaceOne(document)
參數說明
document:要寫入的文檔
writeConcern:寫入策略,默認為 1,即要求確認寫操作,0 是不要求
ordered:指定是否按順序寫入,默認 true,按順序寫入
二、更新文檔
MongoDB通過update函數或者save函數來更新集合中的文檔。
2.1 update 函數
update() 函數用于更新已存在的文檔。
語法格式為:
db.COLLECTION_NAME.update(query,update,options)
query : update的查詢條件,根據這個來選擇需要更新的數據
update:update的對象和一些更新的操作符
upsert:可選參數,意思是如果不存在需要更新的數據,是否要作為新數據插入集合中,參數值為true或者false,默認值是false,不插入
multi:可選參數,是否批量更新,意思是當查詢到多個符合查詢條件的數據時,是否要全部更新,還是只更新第一條,默認是false
writeConcern:可選參數,拋出異常的級別
實操
首先我們在user集合下插入一些數據
db.user.insertMany([{title:"html",page:300},{title:"css",page:300},{title:"js",page:200},{title:"ts",page:250},{title:"webpack",page:220}])
插入成功
接下來我們來對集合中的數據進行更新
第一個需求:將html的page改成500
db.user.update({title:"html"},{title:"html",page:500})
特別注意:更新文檔是更新整個文檔的操作,即使只需要修改一個值,其他屬性一樣需要寫下來,不然其他屬性將被刪除
第二個需求:將所有page為200的改為400
db.user.update({page:200},{$set:{page:400}},{multi:true})
操作結果
在上面采用了$set操作符,用來只更新數據中的某個屬性
2.2 updateOne 和updateMany
db.collection.updateOne() 向指定集合更新單個文檔
db.collection.updateMany() 向指定集合更新多個文檔
2.3 更新操作符
用來指定一個鍵并更新鍵值,若鍵不存在則創建。也就是我們可以通過這個操作符,指定我們需要修改的屬性,而不用更新整個文檔
語法格式:db.COLLECTION_NAME.update({查詢條件},{更新操作符:{更新內容}})
將html改成html5
db.user.update({title:"html"},{$set:{title:"html5"}});
這樣我們就將查找到的文檔中的某個數據修改,而不刪除其他數據
如果數據未被找到,則新建新增數據
對文檔中滿足要求的數字型的值進行增減操作,正則增,負則減
db.user.updateOne({title:"js"},{$inc:{page:-20}})
將title為js的數據的page屬性進行減20的操作
用來刪除鍵,讓鍵的值為空。在編寫命令時$unset里更改數據取值任意,無論給定什么值都表示刪除。
刪除html的page
db.user.update({title:"html"},{$unset:{page:"aaaa"}});
這里插入一個點:如果需要更改全部數據,我們的query屬性填{}即可,也就是查找全部
向文檔的某個數組類型的鍵添加一個數組元素,不過濾重復的數據。鍵不存在,則創建數組類型的鍵
給所有的文檔添加一個auth字段,值為ljc
db.user.update({},{$push:{auth:"ljc"}},{multi:true});
從結果來看是添加成功,需要注意的是,數組,數組,數組!
刪除數據中數組元素,取值只能是1或-1,1表示尾部刪除,-1表示頭部刪除
首先我們先push一下,讓數組豐富一點,給html添加多一個auth
db.user.update({title:"html"},{$push:{auth:"htmlauth"}});
接下來演示pop操作,刪除html中auth數組的第一個值
db.user.update({title:"html"},{$pop:{auth:-1}})
從數組中刪除滿足條件的元素,只要滿足條件都刪除
刪除auth數組中元素內容為ljc
db.user.update({title:"js"},{$pull:{auth:"ljc"}})
可以同時刪除數組中的多個值
將ts中auth中ljc以及ccc刪除掉
db.user.update({title:"ts"},{$pullAll:{auth:["ljc","ccc"]});
對鍵進行重新命名。任何類型的鍵都能重命名
將所有title的屬性名改成name
db.user.update({},{$rename:{title:"name"}},{multi:true})
成功將改成了name
三、刪除文檔
3.1 remove 函數
語法格式:
db.user.remove(
參數說明:
query:可選刪除的文檔條件
justOne:刪除多個或者一個文檔。true只刪除一個,false刪除所有匹配的數據
刪除name值為html的文檔
db.user.remove({name:"html"},{justOne:true})
成功刪除
刪除所有數據
db.user.remove({})
注意:remove豐富不會真正的釋放空間,需要執行db.repairDatabase()來回收磁盤空間
3.2 deleteOne 函數
該方法只刪除滿足條件的第一條文檔,相對于remove簡潔了很多
刪除js
db.user.deleteOne({name:"js"})
3.3 deleteMany 函數
刪除滿足條件的所有文檔
刪除所有page為200的文檔
db.user.deleteMany({page:200})
四、查詢文檔
查詢文檔采用find函數
語法格式
db.collection.find(query, projection)
query :可選,指定查詢的條件
projection :可選,使用投影操作符指定返回的鍵
**注意:**可以通過db.collection.find().pretty()方法以易讀的方式來讀取數據
同樣的可以使用findOne方法,返回一個文檔
4.1 查詢所有
查詢所有文檔
db.user.find({})
根據名字去重
db.user.distinct("name")
注意:MongoDB中使用方法一般都要$號開頭
4.2 條件操作符
采用條件操作符用于比較兩個表達式,再從集合中獲取數據
語法格式:find({鍵:{操作符:條件}})
findOne也可以噢~
等于操作符
查詢所有page為300的文檔對象
db.user.find({page:{$eq:300}})
小于操作符
查詢page小于300的文檔對象
db.user.find({page:{$lt:300}})
小于或等于操作符
查詢page小于等于300的文檔對象
db.user.find({page:{$lte:300}})
大于操作符
查詢page大于250的文檔對象
db.user.find({page:{$gt:250}})
大于等于操作符
查詢page大于等于300的文檔對象
db.user.find({page:{$gte:300}})
不等于操作符
查詢page不等于300的文檔對象
db.user.find({page:{$ne:300}})
多條件查詢,只要滿足in中其中一個條件,就能被查詢出來
查詢page為220和300的文檔對象
db.user.find({page:{$in:[300,220]}})
注意:$in后面的值是一個數組類型!!
于in相反,除了in中的都查詢出來
查詢page不為220和300的文檔對象
db.user.find({page:{$nin:[300,220]}})
查找同時滿足多個條件的文檔對象
語法格式:
db.col.find({$and:[{條件一},{,條件二},…]})
查詢page為300并且name值為node的文檔
db.user.find({$and:[{name:"node"},{page:300}]})
當同時指定多個查詢條件時,默認是并列關系,因此我們可以直接寫
db.user.find({name:"node"},{page:300})
查詢至少滿足多個條件中其中一個的文檔對象
查詢page為300或者name值為node的文檔
db.user.find({$or:[{name:"node"},{page:300}]})
根據值類型來查詢
查詢page為的值類型為number的值
db.user.find({page:{$type:"number"}})
~數據類型如下,來自菜鳥教程~
可以使用類型對應的數字來指定
db.col.find({"title" : {$type : 2}}) 等價于 db.col.find({"title" : {$type : 'string'}})
4.3 正則查詢
利用正則表達式來查詢特定格式的文檔
查詢name以s結尾,不區分大小寫的文檔
db.user.find({name:/s$/i})
4.4 投影查詢
只選擇文檔中的部分數據,而不是整個文檔全部數據
在find()方法中默認會顯示一個文檔中的全部字段,要限制這點只需要設置字段列表值0或1
只顯示name值,同時不顯示_id
db.user.find({},{_id:0,name:1})
顯示name和page
db.user.find({},{page:1,name:1})
注意:_id字段是默認存在的!!
不顯示name和page
db.user.find({},{page:0,name:0})
特別注意
:只有在設置_id:0,的情況下才允許屬性值不同,也就是對于除_id以外的數據,不允許同時一個設置1,一個設置0
例如:
db.user.find({},{_id:0,page:1,name:0})
報錯
4.5 數組查詢
在我們的數據集中,常常會有數組的存在,因此,查詢數組也是很重要的
查詢auth數組中有ljc的文檔
db.user.find({auth:"ljc"})
查詢auth數組中既有ljc又有cssauth的文檔
db.user.find({auth:{$all:["ljc","cssauth"]}})
查詢auth數組中第二個元素為ljc的文檔
通過auth.1來指定數組的第二個元素
db.user.find({"auth.1":"ljc"})
查詢auth數組中第一個到第二個元素(其他字段保留)
db.user.find({},{auth:{$slice:[0,2]}})
查詢auth數組中最后一個元素
db.user.find({},{auth:{$slice:-1}})
4.6 排序
采用sort方法,根據數據進行排序,使用1和-1來指定排序方式為升序還是降序
根據page有小到大進行排序
db.user.find().sort({page:1})
4.7 分頁
使用limit()方法來讀取指定數量的數據外,再使用skip()方法來跳過指定數量的數據
語法格式:
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
實例
db.user.find.limit(2).skip(0) #前兩個 db.user.find.limit(2).skip(2) #3,4
4.8 統計
count用來計算符合條件的值有多少個
統計page中小于270的有多少個
db.user.count({"page":{$lt:270}})
【綻放吧!數據庫】有獎征文火熱進行中:https://bbs.huaweicloud.com/blogs/285617
MongoDB 數據庫 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。