mongodb $用法,等
$set 簡單粗暴 {name:value} dict["name"]=value
$unset 簡單粗暴的刪除欄位 {$unset:{name:1}} del dict["name"]
db.user_info.updateOne({age:200},{$unset:{age:1}})
$inc 引用增加
db.user_info.updateMany({},{$inc:{age:1}})
array操作
$push 在array中追加一個新的元素 [].append(item)
db.user_info.updateOne({name:"200wansui"},{$push:{hobby:10}})
$pull 在array中刪除一個的元素 [].remove(item) [].pop(-1)
db.user_info.updateOne({name:"200wansui"},{$pull:{hobby:0}})
$pop 不含索引 -1 從前往後 1 從後往前
db.user_info.updateOne({name:"200wansui"},{$pop:{hobby:1}})
2.$ 字元
db.user_info.updateOne({hobby:6},{$set:{"hobby.$":"六"}})
儲存符合索引條件資料的下標
3.Object 字典操作
db.user_info.updateOne({name:"200wansui"},{$inc:{"info.tizhong":-5}})
db.user_info.updateOne({name:"200wansui"},{$set:{"info.long":12.5}})
4.array + Object 列表套字典
db.user_info.updateOne({"hobby.shengao":150},{$set:{"hobby.$.long":14}})
5.limit
db.user_info.find({}).limit(5)
選取資料從當前位置選擇5個
6.skip 跳過
db.user_info.find({}).skip(2)
從0開始跳過2條資料為當前位置 7.sort
db.user_info.find({}).sort({ id:-1 })
根據ID進行排序 -1倒敘 1正序 8.limit+skip+sort
db.user_info.find({}).limit(5).skip(10)
db.user_info.find({}).limit(c).skip((p-1)*c)
db.user_info.find({}).limit(5).skip(5).sort({ id:-1 })
優先順序最高的是 sort
其次優先為 skip
最低優先順序 limit
我們在之前的
但是MongoDB中類似這樣的關鍵字有很多, $lt $gt $lte $gte 等等,這麼多我們也不方便記,這裡我們說說幾個比較常見的
一.查詢中常見的 等於 大於 小於 大於等於 小於等於
等於 : 在MongoDB中什麼欄位等於什麼值其實就是 " : " 來搞定 比如 "name" : "路飛學城"
大於 : 在MongoDB中的 大於 > 號 我們用 : $gt 比如 : "score" : { $gt : 80 } 就是 得到 "score" 大於 80 的資料
小於 : 在MongoDB中的 小於 < 號 我們用 : $lt 比如 : "score" : { $lt : 80 } 就是 得到 "score" 小於 80 的資料
大於等於 : 在MongoDB中的 大於等於 >= 號 我們用 : $gte 比如 : "score" : { $gte : 80 } 就是 得到 "score" 大於等於 80 的資料
小於等於 : 在MongoDB中的 小於等於 <= 號 我們用 : $lte 比如 : "score" : { $lte : 80 } 就是 得到 "score" 小於等於 80 的資料
這就是MongoDB中的運算子,是不是很類似我們使用的ORM中的運算子啊,沒錯,最開始的時候我們就已經說了,MongoDB的操作就是很類似ORM的
二.MongoDB中的那些個update修改器: $inc $set $unset $push $pull
在此前的update中,我們用過$set,對資料進行過更新,其實在update中還存在很多的$關鍵字,我們把update中的這些關鍵字叫做 修改器
修改器很多,這裡挑一些重要的來說一說:
1.$inc : Python中的 變數 += 1 , 將查詢到的結果 加上某一個值 然後儲存
還是剛才Collection資料,我們來試一下$inc , 讓不及格的 "路飛學城2" 變成 60 分
成功了 , {$inc:{"score":1}}的意思是,"score"的原有數值上面 +1,那我們再來實驗一次,把60改為20,這怎麼操作呢,其實可以理解為在 60 上加一個 -40
又成功了 , {$inc:{"score":-20}}也來越喜歡英俊瀟灑又不會翻車的自己了
$inc 的用法是不是很簡單啊,就是原有基礎上在增加多少對吧
2.$set : 此前我們已經提到過 $set 的用法和特性(沒有就自動新增一條)了
再做一個例子:把 "score" 為 100 分 的 "english_name" 賦值為 "LuffyCity"
再把 "score" 為 20 分的 "score" 賦值為 59 分
完美~
3.$unset : 用來刪除Key(field)的
做一個小例子 : 剛才我們有一個新的"english_name" 這個field ,現在我們來刪除它
成功了! {$unset:{"english_name" : 1}} 就是刪除 "english_name" 這個 field 相當於 關係型資料庫中刪除了 欄位
4. $push : 它是用來對Array (list)資料型別進行 增加 新元素的,相當於我們大Python中 list.append() 方法
做一個小例子 :首先我們要先對原有資料增加一個Array型別的field:
使用update $set 的方法只能為Document中的第一條新增
使用updateMany $set 的方法 可以為所有滿足條件的 Document 新增 "test_list" , 注意我這裡的條件為空 " {} " 就算是為空,也要寫上"{}" 記住記住記住
接下來我們就要隊列表進行添加了: 將 "score" 為 100 的Document 中"test_list" 新增一個 6
$push 是在 Array(list) 的尾端加入一個新的元素 {$push : {"test_list" : 6}}
5.$pull : 有了$push 對Array型別進行增加,就一定有辦法對其內部進行刪減,$pull 就是指定刪除Array中的某一個元素
做一個例子: 把我們剛才$push進去的 6 刪除掉
問題來了,如果 Array 資料型別中 如果有 多個 6 怎麼辦呢?
全部刪掉了.....
得出了一個結論,只要滿足條件,就會將Array中所有滿足條件的資料全部清除掉
6. $pop : 指定刪除Array中的第一個 或 最後一個 元素
做個小例子: 刪除"score" 等於 100 分 test_list 的最後一個元素
怎麼刪除第一個呢?
{$pop:{"test_list" : -1}} -1 代表最前面, 1 代表最後邊 (這和我們大Python正好相反) 記住哦
在MongoDB中有一個非常神奇的符號 "$"
"$" 在 update 中 加上關鍵字 就 變成了 修改器
其實 "$" 字元 獨立出現也是有意義的 , 我起名叫做代指符
首先看個例子: 還是這個Collection
現在把 "score": 100 的 test_list 裡面的 2 改為 9
{$set :{"test_list.0" : 9}} 這樣就是對應 Array 中的下標進行修改了 "test_list.下標"
問題來了 如果 是 一個很長很長很長的 Array 你要查詢其中一個值,把這個值修改一下怎麼整呢?
神奇不神奇?
$ 字元 在語句中代表了什麼呢? 下標,位置
解釋一下: 首先我們查詢一下db.Oldboy.findOne({"score":100,"test_list":3}) 返回 給我們滿足條件的資料對吧
那麼 如果 我們 使用 update的話, 滿足條件的資料下標位置就會傳遞到 $ 字元中,在我們更新操作的時候就相當於 對這個位置 的元素進行操作
相比關係型資料庫, Array [1,2,3,4,5] 和 Object { 'name':'DragonFire' } 是MongoDB 比較特殊的型別了
特殊在哪裡呢?在他們的操作上又有什麼需要注意的呢?
那我們先建立一條資料,包含 Array 和 Object 型別
db.Oldboy.insert({"name":"路飛學城-騎士計劃","price":[19800,19500,19000,18800],"other":{"start":"2018年8月1日","start_time":"08:30","count":150}})
{ "_id" : ObjectId("5b17d01a49bf137b585df891"), "name" : "路飛學城-騎士計劃", "price" : [ 19800, 19500, 19000, 18800 ], "other" : { "start" : "2018年8月1日", "start_time" : "08:30", "count" : 150 } }
好的,這條資料已經完成了
針對這條資料我們進行一系列的操作,並講解使用方式
一.Array 小秀一波
1.把price 中 19000 改為 19300
db.Oldboy.update({"name":"路飛學城-騎士計劃"},{$set:{"price.2":19300}})
我們用了引用下標的方法更改了數值 , "price.2"代指的是 Array 中第3個元素
2. 混合用法
如果 price.1 中小於19800 則加 200
db.Oldboy.update({"name":"路飛學城-騎士計劃","price.1":{$lt:19800}},{$inc:{"price.1":200}})
複習一下:"price.1":{$lt:19800} 是查詢 price.1 小於 19800
複習兩下:{$inc:{"price.1":200}} 是什麼啊? price.1 拿出來 加上 200 之後 再存進去
那麼順理成章的混合到一起了
上節課我們也學習了 $ 的用法,現在我們混搭 $ 再做一個練習
我們把 price 小於 19500 的 自動補上 200
db.Oldboy.updateMany({"name":"路飛學城-騎士計劃","price":{$lt:19500}},{$inc:{"price.$":200}})
細心的同學已經發現了,只改了第一個,是的 $ 這個只儲存一個下標,批量更改的話,嘻嘻嘻嘻截至2017年1月1日,MongoDB沒有這個功能
你只要把這個Array 拿出來,在程式裡面改完,原方不動的放回去不就搞定了嗎
二.Object 字典總玩兒過吧,但是這裡更像是 JavaScript 中的 Object 物件
1.把other中 count 改為 199
db.Oldboy.update({"name":"路飛學城-騎士計劃"},{$set:{"other.count":199}})
對了就是在這個物件 打點兒 key 就可以更改數值了 , 要注意的是, 咱們用的 $set 進行修改的,那麼就意味著,如果沒有"other.count"這個field的話,他會自動建立
這個用法就到這裡了,下面我們玩兒個更深的
2.混合用法
如果 count 小於 200 那麼 加 10
這麼玩兒完了之後,條件位置的打點兒呼叫,也嘗試過了
Object的用法就這麼多了
三. Array + Object 的用法 告訴你們,這個老High了
首先,我們要先建立一條 Document 嘻嘻嘻嘻嘻
{ "_id" : ObjectId("5b17de9d44280738145722b9"), "name" : "路飛學城-騎士計劃", "price" : [ { "start" : "2018年8月1日", "start_time" : "08:30", "count" : 150 }, { "start" : "2018年8月2日", "start_time" : "09:30", "count" : 160 }, { "start" : "2018年8月3日", "start_time" : "10:30", "count" : 170 }, { "start" : "2018年8月4日", "start_time" : "11:30", "count" : 180 } ] }
insert的程式碼要自己寫哦,學完一直沒怎麼練習過,Document新增完成之後
1.把count 大於 175 的field 加 15
混搭完成:
db.Oldboy.update({"price.count":{$gt:175}},{$inc:{"price.$.count":15}})
分析一下我們的程式碼:
{"price.count":{$gt:175}}, price 明明是個 Array 啊 怎麼就直接 打點兒 count 了呢 這裡要知道price 打點兒 就是從內部的Object 中找到 count 小於 175 的結果
{$inc:{"price.$.count":15}} , 這裡就比較好理解了,price裡面第 $ (大於175的第一個) 個元素中 count 增加 15
我們要學會舉一反三 $set 如果忘了, 就再來一個例子吧
2. 把 count 大於 180 的 start 改為 "2018年8月10日"
不做過多解釋了,沒學會的翻回去看吧
到此為止我們MongoDB的操作階段就已經學習結束了.
我們已經學過MongoDB的 find() 查詢功能了,在關係型資料庫中的選取(limit),排序(sort) MongoDB中同樣有,而且使用起來更是簡單
首先我們看下新增幾條Document進來
現在有四條Document 根據它們, 對 Limit Skip Sort 分別展開學習 最後來一個 大雜燴
1. Limit 選取 : 我要從這些 Document 中取出多少個
做個小例子 : 我只要 2 條 Document
結果是很明顯的,很赤裸裸的,很一絲不掛的
但是我還是要解釋一下 : limit(2) 就是選取兩條Document, 從整個Collection的第一條 Document 開始選取兩條
如果我們不想從第一條Document開始選取,怎麼辦呢?
2.Skip 跳過 : 我要跳過多少個Document
做個小例子 : 我要跳過前兩個 Document 直接從第三個Document 開始
結果還是很明顯,很赤裸
按照國際慣例解釋一下 : skip(2) 就是跳過兩條Document, 從整個Collection 的第一條 Document 開始跳,往後跳兩條
另一個例子 : 跳過第一條 直接從 第二條 開始
問題來了,我只想要第二條和第三條怎麼處理呢?
3.Limit + Skip : 從這兒到那兒 的 選取
就是剛才的問題,一個小例子 : 我只想要第二條和第三條怎麼處理呢
國際慣例 : 跳過第一條Document 從第二條開始選取兩條 Document
彆著急,還有另一種寫法
兩種寫法完全得到的結果完全一樣但是國際慣例的解釋卻不同
國際慣例 : 選取兩條Document 但是要 跳過 第一條Document 從 第二條 開始 選取
繞了半天,都暈了,注意這裡特別要注意了!!!!!! 這裡的兩種寫法,一定一定一定要記住一個,因為只要記住一個就行了,完全完全沒區別,一個符合中國人的理解,一個是其他國家的理解
4. Sort 排序 : 將結果按照關鍵字排序
做個小例子 : 將find出來的Document 按照 price 進行 升序 | 降序 排列
國際慣例 : 按照 price 欄位進行升序 , 1 為升序 , -1 為降序
5. Limit + Skip + Sort 混搭來一把
一個例子 : 選取第二條第三條 並 按照 price 進行 升序排列
問題出現了, 按道理不應該是 9800 然後 19800 嗎?
知識點來嘍
重點 : Sort + Skip + Limit 是有執行優先順序的 他們的界別分別是 優先 Sort 其次 Skip 最後 Limt
Skip + Limit 的優先順序 也是先 Skip 再 Limit