簡介
它和我們使用的關系型數據庫最大的區別就是約束性,可以說文件型數據庫幾乎不存在約束性,理論上沒有主外鍵約束,沒有存儲的數據類型約束等等
關系型數據庫中有一個 "表" 的概念,有 "字段" 的概念,有 "數據條目" 的概念
MongoDB中也同樣有以上的概念,但是名稱發生了一些變化,嚴格意義上來說,兩者的概念即為相似,但又有些出入,不過無所謂,我們就當是以上概念就好啦
數據結構
MongoDB的每個表(Collection)中存儲的每條數據(Documents)都是一個一個的Json,Json中的每一個字段(Key)我們稱之為:Field
就此我們引出了三個關鍵字,Collection也就是關系型數據庫中"表"的概念,Documents就是"數據條目",Field就是"字段"
軟件安裝
本博客基于MongoDB 3.4進行演示,小伙伴們自行去下載一個,點擊下一步下一步安裝完成后,加入MongoDB的bin文件中,復制文件路徑并添加到環境變量中,這個時候打開cmd輸入mongod進行測試
那我們就在C:下面創建一個data文件夾,里面再創建一個db文件夾
再啟動服務發現OJBK了
我們再開啟一個cmd窗口去鏈接我們開啟的mongod服務,發現能夠正確連上了。這里需要記住的小小知識點有,常用數據庫軟件的默認端口號
MySQL:3306
Redis:6379
MongoDB:27017
提醒一下,在操作mongoDB數據庫的時候,你可千萬別把剛剛啟動的mogond窗口關了哈,那就相當于是數據庫服務器,你叉了就GG了,恭喜再來一次了就!
MongoDB中的增刪改查
在開始之前需要介紹一下MongoDB獨有的特點:使用不存在的對象即創建該對象到內存,如果對創建的對象進行了增加數據操作,那么就會在數據庫中真真實實,明明白白的自動幫我們創建出來(這一特性對數據的操作依然有效,即操作數據沒有的字段,那么就會給該數據新增這一字段)
增
插入數據的方式有插入單挑和插入多條兩種(insertOne insertMany)
insertOne: 插入一條數據,官方推薦
insertMany:插入多條數據,無需參數控制,官方推薦,多條數據用[]包裹,這個更普遍的叫法是array,而不是我們python里面的列表,將列表別人可能不懂,但是你講array那肯定能懂
查
介紹完增刪改查你就會發現,只有查有點特殊,
查詢多條find后面不跟Many
查詢單條findOne
改
修改一條updateOne({})
這里就展示了開頭我們說的mongodb的特殊性,使用不存在的對象就自動給你創建,至于上面出現的$set后面再介紹
修改多條數據updateMany({})
刪
remove({}):無條件刪除數據,這里要注意了,這是刪除所有數據,清空Collection
MongoDB數據結構
Object ID :Documents 自生成的 _id
String: 字符串,必須是utf-8
Boolean:布爾值,true 或者false (這里有坑哦~在我們大Python中 True False 首字母大寫)
Integer:整數 (需要注意的是mongoDB中出現的數字默認都是Double類型而不是整型)
Double:浮點數 (沒有float類型,所有小數都是Double)
Arrays:數組或者列表,多個值存儲到一個鍵 (list哦,大Python中的List哦)
Object:如果你學過Python的話,那么這個概念特別好理解,就是Python中的字典,這個數據類型就是字典
Null:空數據類型 , 一個特殊的概念,None Null
Timestamp:時間戳
Date:存儲當前日期或時間unix時間格式 (我們一般不用這個Date類型,時間戳可以秒殺一切時間類型)
看著挺多的,但是真要是用的話,沒那么復雜,很簡單的哦
?1.Object ID:
"_id" : ObjectId("5b151f8536409809ab2e6b26")#"5b151f85" 代指的是時間戳,這條數據的產生時間 #"364098" 代指某臺機器的機器碼,存儲這條數據時的機器編號 #"09ab" 代指進程ID,多進程存儲數據的時候,非常有用的 #"2e6b26" 代指計數器,這里要注意的是,計數器的數字可能會出現重復,不是唯一的 #以上四種標識符拼湊成世界上唯一的ObjectID #只要是支持MongoDB的語言,都會有一個或多個方法,對ObjectID進行轉換 #可以得到以上四種信息#注意:這個類型是不可以被JSON序列化的
這是MongoDB生成的類似關系型DB表主鍵的唯一key,注意中說了,這個ID不能被序列化,那么我們該如何傳輸呢?一會介紹pymongo的時候會給出答案!
2.Date:
"_id" : ObjectId("5b163ba1993ddc4cd4918eb2"),"name" : "Hello","date" : ISODate("2018-06-05T15:28:33.705+08:00")
一般不用,而是用ISODate.valueof()直接是時間戳格式,到哪都好使
MondoDB中的$相關
一.查詢中常見的 等于 大于 小于 大于等于 小于等于
等于 : 在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
1.$inc : Python中的? 變量 += 1 , 將查詢到的結果 加上某一個值 然后保存
?{$inc:{"score":1}}的意思是,"score"的原有數值上面 +1,$inc 的用法是不是很簡單啊,就是原有基礎上在增加多少對吧
2.$set : 此前我們已經提到過 $set 的用法和特性(沒有就自動添加一條)了
再把 "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中的$奇妙用法
在MongoDB中有一個非常神奇的符號 "$"
"$"? 在 update 中 加上關鍵字 就 變成了 修改器
其實 "$" 字符 獨立出現也是有意義的 , 我起名叫做代指符
針對object操作
前面的price.price表示的是price這個字段下的所有含有price鍵的數據值,后面的price.$指的就是找到的array下表對應的y一行數據{},再.字段拿到鍵對應的值
MongoDB中的限制查詢條數
1. Limit 選取 : 我要從這些 Document 中取出多少個
做個小例子 : 我只要 2 條 Document
2.Skip 跳過 : 我要跳過多少個Document
做個小例子 : 我要跳過前兩個 Document 直接從第三個Document 開始
3.Limit + Skip : 從這兒到那兒 的 選取
就是剛才的問題,一個小例子 : 我只想要第二條和第三條怎么處理呢
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
?
看一次,記不住
看兩次,不會用
看三次,不如自己做一次
做一次,不如做三次
?
練習一下加深印象