1. 程式人生 > >mongodb $用法,等

mongodb $用法,等

1.$修改器 :
 $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 之 手把手教你增刪改查 MongoDB - 2 中提到過 $set 這個系統關鍵字,用來修改值的對吧

但是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