MongoDB的文檔操做
在MongoDB中文檔是指多個鍵及其關聯的值有序地放置在一塊兒就是文檔,其實指的就是數據,也是咱們平時操做最多的部分。html
MongoDB中的文檔的數據結構和 JSON 基本同樣。全部存儲在集合中的數據都是 BSON 格式。java
BSON 是一種相似 JSON 的二進制形式的存儲格式,是 Binary JSON 的簡稱。web
插入文檔
插入單個文檔
注意:正則表達式
- 新增時不須要考慮field,若是field已經存在則向指定field中新增。若是field不存在,則在collection中新添加一個filed
- 向collection中新增數據時,若是collection不存在,則自動建立collection
向dev集合中插入單個文檔。mongodb
能夠使用insert/insertOne/save執行新增,語法徹底相同,下面是三種寫法等效:數組
db.c1.insert({name:"張三"}); db.c1.save({name:"張三"}); db.c1.insertOne({name:"張三"});
區別:數據結構
當明確給定主鍵時,若是主鍵值已經存在save表示修改,insert/insertOne會報主鍵重複。less
注意:(save修改必須在MongoDB的客戶端操做,不能使用第三方客戶端,不然沒法執行成功)svg
命令中_id是ObjectId類型,須要經過ObjectId函數把字符串轉換爲ObjectId函數
db.c1.save({_id:ObjectId("5e81b3ac4d4d000026004f6a"),name:"jqk"})
插入多個文檔
能夠使用insert/insertMany/save執行新增,區別於單條新增把新增函數參數由對象類型({})變成數組類型([{}])下面是三種寫法等效:
db.c1.insert([{name:"a"},{name:"b"}]); db.c1.insertMany([{name:"a"},{name:"b"}]); db.c1.save([{name:"a"},{name:"b"}]);
更新文檔
MongoDB經過update函數或者save函數來更新集合中的文檔。
update函數
update() 函數用於更新已存在的文檔。
語法格式:db.COLLECTION_NAME.update({查詢條件},{更新內容},{更新參數(可選)})
其中更新內容爲整個文檔更新內容,若是更新內容中只有一個屬性,除了_id之外其餘屬性將會被設置null。
先新增一條測試數據
db.c1.insert({name:"張三",age:12,address:"地址"});
修改,name改爲了李四,age和address都被設置null了。(mongodb中若是一個集合中某個屬性全部的文檔對象都爲空時會刪除這個屬性)
db.c1.update({name:"張三"},{name:"李四"});
更新操做符
$set操做符(須要記憶)
$set操做符:用來指定一個鍵並更新鍵值,若鍵不存在並建立。只能修改第一個document
語法格式:db.COLLECTION_NAME.update({查詢條件},{更新操做符:{更新內容}})
$set的做用總結:
- 只修改特定的Field,解決update默認修改整個document狀況
db.c1.update({name:"張三"},{$set:{name:"王五"}});
- 默認只修改符合條件的第一個document,若是須要所有修改,添加更新參數multi:true
db.c1.update({name:"張三"},{$set:{age:18}},{multi:true});
- 若是Field不存在,能夠新建一個Field
db.c1.update({name:"張三"},{$set:{sex:"男"}})
$inc操做符
$inc操做符:能夠對文檔的某個值爲數字型(只能爲知足要求的數字)的鍵進行增減的操做。若是給定正數表示新增,若是給定負數表示減小。
把王五的年齡減小5歲。
db.c1.update({name:"王五"},{$inc:{age:-5}});
$unset操做符
$unset
操做符:主要是用來刪除鍵。讓鍵的值爲空。在編寫命令時$unset裏field取值任意,不管給定什麼值都表示刪除。
刪除名稱爲王五的地址。
db.c1.update({name:"王五"},{$unset:{address:"隨意"}});
$push操做符
$push
操做符:向文檔的某個數組類型的鍵添加一個數組元素,不過濾重複的數據。添加時鍵存在,要求鍵值類型必須是數組;鍵不存在,則建立數組類型的鍵。
向集合c1中全部文檔對象添加了數組類型屬性hobby,並添加一個值寫代碼。若是再次執行,表示向hobby中再添加一個值寫代碼。默認只修改符合條件的第一條,若是須要所有修改,添加multi屬性。
db.c1.update({},{$push:{hobby:"寫代碼"}},{multi:true});
$pop操做符
$pop操做符:刪除數據元素。可取值只能是1或-1。1表示尾部刪除,-1表示頭部刪除
刪除hobby中第一個元素。其中$pop中key是要操做的數組類型屬性。
db.c1.update({name:"李四"},{$pop:{hobby:-1}})
$pull操做符
$pull操做符:從數組中刪除知足條件的元素,只要知足條件都刪除。
刪除hobby中元素內容爲看尚學堂視頻,若是存在多個都刪除。
db.c1.update({name:「王五」},{$pull:{hobby:「看尚學堂視頻」}});
$pullAll操做符
$pullAll
操做符:能夠設置多個條件。
刪除王五中hobby爲寫代碼和看尚學堂視頻的值。其中屬性(hobby)取值必定要是數組類型。
db.c1.update({name:"王五"},{$pullAll:{hobby:["寫代碼","看尚學堂的視頻"]}});
$rename
$rename
操做符:對鍵進行從新命名。任何類型的鍵都能重命名。
修改王五的name屬性爲username。
db.c1.update({name:"王五"},{$rename:{name:"username"}});
查詢文檔
find()函數
在MongoDB中能夠使用find()函數查詢文檔。
語法格式爲:find({查詢條件(可選)},{指定投影的鍵(可選)})
若是未給定參數則表示查詢全部數據。
db.c1.find();
查詢全部name爲張三的文檔對象
db.c1.find({name:"張三"})
投影操做
投影查詢指的就是哪些列被顯示或不被顯示。寫到投影(projection)裏面的屬性可取值爲1(顯示)或0(不顯示)。除了_id之外其餘屬性取值必須是相同。
sex和hobby不顯示,其餘屬性都顯示
db.c1.find({name:"張三"},{sex:0,hobby:0})
顯示sex和hobby,默認_id也是顯示
db.c1.find({name:"張三"},{sex:1,hobby:1})
只顯示sex和hobby。只有這種狀況才能出現屬性取值不同
db.c1.find({name:"張三"},{_id:0,sex:1,hobby:1})
findOne()函數
findOne()函數只返回知足條件的第一條數據。
返回第一行document對象。
db.c1.findOne();
返回名字爲張三的第一條數據
db.c1.findOne({name:"張三"})
正則查詢
MongoDB中查詢條件也能夠使用正則表達式做爲匹配約束。正則表達式語法與JavaScript正則表達式語句徹底相同。正則內容須要寫在 / / 以前。
語法格式:db.COLLECTION_NAME.find({字段名:正則表達式});、
能夠實現模糊查詢
查詢name中存在三的文檔對象
db.c1.find({name:/三/});
或
db.COLLECTION_NAME.find({字段名:{$regex:正則表達式,$options:正則選項}});
第二種方式比第一種方式多了正則選項,功能更多。
正則表達式格式:/xxx/
正則選項:
i - 不區分大小寫以匹配大小寫的狀況。
m - 多行查找,若是內容裏面不存在換行符號(例如 \n)或者條件上沒有(start/end),該選項沒有任何效果
x - 設置x選項後,正則表達式中的非轉義的空白字符將被忽略。須要 r e g e x 與 regex與 regex與options語法
s - 容許點字符(即.)匹配包括換行符在內的全部字符。須要 r e g e x 與 regex與 regex與options語法
i,m,x,s能夠組合使用。
示例:
錄入數據
db.c1.insert({name:"abc"}); db.c1.insert({name:"bcd"}); db.c1.insert({name:"ABC"}); db.c1.insert({name:"BCD"});
只能查詢包含小寫b的文檔對象
db.c1.find({name:/b/})
查詢時不區分大小寫,只要包含b或B都能查詢出來
db.c1.find({name:{ r e g e x : / b / , regex:/b/, regex:/b/,options:「i」}});
條件操做符
條件操做符用於比較兩個表達式並從mongoDB集合中獲取數據。
語法格式:find({鍵:{操做符:條件}})或者findOne({鍵:{操做符:條件}})
$gt
(>) 大於操做符,greater than 縮寫。用right記憶,表示右側角括號。
查詢全部年齡大於10的文檔對象
db.c1.find({age:{$gt:10}});
$lt
(<) 小於操做符。less than縮寫,用left記憶,左角括號
查詢全部年齡小於10的文檔對象
db.c1.find({age:{$lt:10}});
$eq
(==)等於操做符,equals
查詢年齡等於8
db.c1.find({age:{$eq:8}});
等效於
db.c1.find({age:8});
$ne
(!=)不等操做符 not equals
查詢全部年齡不是18歲的,包含了age屬性沒有值的文檔對象。
db.c1.find({age:{$ne:8}});
$gte
(>=)大於或等於操做符greater than equals
查詢全部年齡大於等於8的文檔對象。若是文檔沒有age屬性沒法被查詢。
db.c1.find({age:{$gte:8}});
$lte
(<=)小於或等於操做符less than equals
查詢小於等於8的文檔對象。
db.c1.find({age:{$lte:8}});
$in
咱們能夠使用 i n 操 做 符 來 表 示 多 條 件 查 詢 , in操做符來表示多條件查詢, in操做符來表示多條件查詢,in中多條件的關係爲或者關係,只要知足其中一個就能被查詢出來,因爲$in取值爲多個,因此是數組類型。
查詢年齡爲8或10或12的文檔對象
db.c1.find({age:{$in:[8,10,12]}})
$nin
not in,與$in的結果取反。
只要age不是8或10或12的文檔對象都能查詢出來。
db.c1.find({age:{$nin:[8,10,12]}})
本文同步分享在 博客「cwl_java」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。