mongoDB操作详细
簡介
它和我們使用的關(guān)系型數(shù)據(jù)庫最大的區(qū)別就是約束性,可以說文件型數(shù)據(jù)庫幾乎不存在約束性,理論上沒有主外鍵約束,沒有存儲的數(shù)據(jù)類型約束等等
關(guān)系型數(shù)據(jù)庫中有一個 "表" 的概念,有 "字段" 的概念,有 "數(shù)據(jù)條目" 的概念
MongoDB中也同樣有以上的概念,但是名稱發(fā)生了一些變化,嚴(yán)格意義上來說,兩者的概念即為相似,但又有些出入,不過無所謂,我們就當(dāng)是以上概念就好啦
數(shù)據(jù)結(jié)構(gòu)
MongoDB的每個表(Collection)中存儲的每條數(shù)據(jù)(Documents)都是一個一個的Json,Json中的每一個字段(Key)我們稱之為:Field
就此我們引出了三個關(guān)鍵字,Collection也就是關(guān)系型數(shù)據(jù)庫中"表"的概念,Documents就是"數(shù)據(jù)條目",Field就是"字段"
軟件安裝
本博客基于MongoDB 3.4進(jìn)行演示,小伙伴們自行去下載一個,點擊下一步下一步安裝完成后,加入MongoDB的bin文件中,復(fù)制文件路徑并添加到環(huán)境變量中,這個時候打開cmd輸入mongod進(jìn)行測試
那我們就在C:下面創(chuàng)建一個data文件夾,里面再創(chuàng)建一個db文件夾
再啟動服務(wù)發(fā)現(xiàn)OJBK了
我們再開啟一個cmd窗口去鏈接我們開啟的mongod服務(wù),發(fā)現(xiàn)能夠正確連上了。這里需要記住的小小知識點有,常用數(shù)據(jù)庫軟件的默認(rèn)端口號
MySQL:3306
Redis:6379
MongoDB:27017
提醒一下,在操作mongoDB數(shù)據(jù)庫的時候,你可千萬別把剛剛啟動的mogond窗口關(guān)了哈,那就相當(dāng)于是數(shù)據(jù)庫服務(wù)器,你叉了就GG了,恭喜再來一次了就!
MongoDB中的增刪改查
在開始之前需要介紹一下MongoDB獨有的特點:使用不存在的對象即創(chuàng)建該對象到內(nèi)存,如果對創(chuàng)建的對象進(jìn)行了增加數(shù)據(jù)操作,那么就會在數(shù)據(jù)庫中真真實實,明明白白的自動幫我們創(chuàng)建出來(這一特性對數(shù)據(jù)的操作依然有效,即操作數(shù)據(jù)沒有的字段,那么就會給該數(shù)據(jù)新增這一字段)
增
插入數(shù)據(jù)的方式有插入單挑和插入多條兩種(insertOne insertMany)
insertOne: 插入一條數(shù)據(jù),官方推薦
insertMany:插入多條數(shù)據(jù),無需參數(shù)控制,官方推薦,多條數(shù)據(jù)用[]包裹,這個更普遍的叫法是array,而不是我們python里面的列表,將列表別人可能不懂,但是你講array那肯定能懂
查
介紹完增刪改查你就會發(fā)現(xiàn),只有查有點特殊,
查詢多條find后面不跟Many
查詢單條findOne
改
修改一條updateOne({})
這里就展示了開頭我們說的mongodb的特殊性,使用不存在的對象就自動給你創(chuàng)建,至于上面出現(xiàn)的$set后面再介紹
修改多條數(shù)據(jù)updateMany({})
刪
remove({}):無條件刪除數(shù)據(jù),這里要注意了,這是刪除所有數(shù)據(jù),清空Collection
MongoDB數(shù)據(jù)結(jié)構(gòu)
Object ID :Documents 自生成的 _id
String: 字符串,必須是utf-8
Boolean:布爾值,true 或者false (這里有坑哦~在我們大Python中 True False 首字母大寫)
Integer:整數(shù) (需要注意的是mongoDB中出現(xiàn)的數(shù)字默認(rèn)都是Double類型而不是整型)
Double:浮點數(shù) (沒有float類型,所有小數(shù)都是Double)
Arrays:數(shù)組或者列表,多個值存儲到一個鍵 (list哦,大Python中的List哦)
Object:如果你學(xué)過Python的話,那么這個概念特別好理解,就是Python中的字典,這個數(shù)據(jù)類型就是字典
Null:空數(shù)據(jù)類型 , 一個特殊的概念,None Null
Timestamp:時間戳
Date:存儲當(dāng)前日期或時間unix時間格式 (我們一般不用這個Date類型,時間戳可以秒殺一切時間類型)
看著挺多的,但是真要是用的話,沒那么復(fù)雜,很簡單的哦
?1.Object ID:
"_id" : ObjectId("5b151f8536409809ab2e6b26")#"5b151f85" 代指的是時間戳,這條數(shù)據(jù)的產(chǎn)生時間 #"364098" 代指某臺機(jī)器的機(jī)器碼,存儲這條數(shù)據(jù)時的機(jī)器編號 #"09ab" 代指進(jìn)程ID,多進(jìn)程存儲數(shù)據(jù)的時候,非常有用的 #"2e6b26" 代指計數(shù)器,這里要注意的是,計數(shù)器的數(shù)字可能會出現(xiàn)重復(fù),不是唯一的 #以上四種標(biāo)識符拼湊成世界上唯一的ObjectID #只要是支持MongoDB的語言,都會有一個或多個方法,對ObjectID進(jìn)行轉(zhuǎn)換 #可以得到以上四種信息#注意:這個類型是不可以被JSON序列化的這是MongoDB生成的類似關(guān)系型DB表主鍵的唯一key,注意中說了,這個ID不能被序列化,那么我們該如何傳輸呢?一會介紹pymongo的時候會給出答案!
2.Date:
"_id" : ObjectId("5b163ba1993ddc4cd4918eb2"),"name" : "Hello","date" : ISODate("2018-06-05T15:28:33.705+08:00")一般不用,而是用ISODate.valueof()直接是時間戳格式,到哪都好使
MondoDB中的$相關(guān)
一.查詢中常見的 等于 大于 小于 大于等于 小于等于
等于 : 在MongoDB中什么字段等于什么值其實就是 " : " 來搞定 比如 "name" : "啊哈哈"
大于 : 在MongoDB中的 大于 > 號 我們用 : $gt? 比如 :? "score" : { $gt : 80 } 就是 得到 "score" 大于 80 的數(shù)據(jù)
小于 : 在MongoDB中的 小于 < 號 我們用 : $lt? 比如 :? "score" : { $lt : 80 } 就是 得到 "score" 小于 80 的數(shù)據(jù)
大于等于 : 在MongoDB中的 大于等于 >= 號 我們用 : $gte? 比如 :? "score" : { $gte : 80 } 就是 得到 "score" 大于等于 80 的數(shù)據(jù)
小于等于 : 在MongoDB中的 小于等于 <= 號 我們用 : $lte? 比如 :? "score" : { $lte : 80 } 就是 得到 "score" 小于等于 80 的數(shù)據(jù)
這就是MongoDB中的運算符,是不是很類似我們使用的ORM中的運算符啊,沒錯,最開始的時候我們就已經(jīng)說了,MongoDB的操作就是很類似ORM的
二.MongoDB中的那些個update修改器: $inc $set $unset $push $pull
1.$inc : Python中的? 變量 += 1 , 將查詢到的結(jié)果 加上某一個值 然后保存
?{$inc:{"score":1}}的意思是,"score"的原有數(shù)值上面 +1,$inc 的用法是不是很簡單啊,就是原有基礎(chǔ)上在增加多少對吧
2.$set : 此前我們已經(jīng)提到過 $set 的用法和特性(沒有就自動添加一條)了
再把 "score" 為 20 分的 "score" 賦值為 59 分
3.$unset : 用來刪除Key(field)的
做一個小例子 : 剛才我們有一個新的"english_name" 這個field ,現(xiàn)在我們來刪除它
成功了! {$unset:{"english_name" : 1}} 就是刪除 "english_name" 這個 field 相當(dāng)于 關(guān)系型數(shù)據(jù)庫中刪除了 字段
4. $push : 它是用來對Array (list)數(shù)據(jù)類型進(jìn)行 增加 新元素的,相當(dāng)于我們大Python中 list.append() 方法
首先我們要先對原有數(shù)據(jù)增加一個Array類型的field:
使用update $set 的方法只能為Document中的第一條添加
使用updateMany $set 的方法 可以為所有滿足條件的 Document 添加 "test_list" , 注意我這里的條件為空 " {} " 就算是為空,也要寫上"{}" 記住記住記住
接下來我們就要隊列表進(jìn)行添加了: 將 "score" 為 100 的Document 中"test_list" 添加一個 6
$push 是在 Array(list) 的尾端加入一個新的元素? {$push : {"test_list" : 6}}
?5.$pull : 有了$push 對Array類型進(jìn)行增加,就一定有辦法對其內(nèi)部進(jìn)行刪減,$pull 就是指定刪除Array中的某一個元素
把我們剛才$push進(jìn)去的 6 刪除掉
如果 Array 數(shù)據(jù)類型中 如果有 多個 6 怎么辦呢?
全部刪掉了.....
得出了一個結(jié)論,只要滿足條件,就會將Array中所有滿足條件的數(shù)據(jù)全部清除掉
6. $pop : 指定刪除Array中的第一個 或 最后一個 元素
做個小例子: 刪除"score" 等于 100 分? test_list 的最后一個元素
怎么刪除第一個呢?
{$pop:{"test_list" : -1}}? -1 代表最前面, 1 代表最后邊 (這和我們大Python正好相反) 記住哦
MongoDB中的$奇妙用法
在MongoDB中有一個非常神奇的符號 "$"
"$"? 在 update 中 加上關(guān)鍵字 就 變成了 修改器
其實 "$" 字符 獨立出現(xiàn)也是有意義的 , 我起名叫做代指符
針對object操作
前面的price.price表示的是price這個字段下的所有含有price鍵的數(shù)據(jù)值,后面的price.$指的就是找到的array下表對應(yīng)的y一行數(shù)據(jù){},再.字段拿到鍵對應(yīng)的值
MongoDB中的限制查詢條數(shù)
1. Limit 選取 : 我要從這些 Document 中取出多少個
做個小例子 : 我只要 2 條 Document
2.Skip 跳過 : 我要跳過多少個Document
做個小例子 : 我要跳過前兩個 Document 直接從第三個Document 開始
3.Limit + Skip : 從這兒到那兒 的 選取
就是剛才的問題,一個小例子 : 我只想要第二條和第三條怎么處理呢
4. Sort 排序 : 將結(jié)果按照關(guān)鍵字排序
做個小例子 : 將find出來的Document 按照 price 進(jìn)行 升序 | 降序 排列
國際慣例 : 按照 price 字段進(jìn)行升序 , 1 為升序 , -1 為降序
5. Limit + Skip + Sort 混搭來一把
一個例子 : 選取第二條第三條 并 按照 price 進(jìn)行 升序排列
問題出現(xiàn)了, 按道理不應(yīng)該是 9800 然后 19800 嗎?
知識點來嘍
重點 : Sort + Skip + Limit 是有執(zhí)行優(yōu)先級的 他們的界別分別是 優(yōu)先 Sort? 其次 Skip 最后 Limt
Skip + Limit 的優(yōu)先級 也是先 Skip 再 Limit
?
看一次,記不住
看兩次,不會用
看三次,不如自己做一次
做一次,不如做三次
?
練習(xí)一下加深印象
轉(zhuǎn)載于:https://www.cnblogs.com/Dominic-Ji/p/9524079.html
總結(jié)
以上是生活随笔為你收集整理的mongoDB操作详细的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 孕妇梦到蟑螂是胎梦吗
- 下一篇: PowerShell使用教程