【MongoDB】MongoDB操做及python中使用MongoDBhtml
1、Mongodb簡介python
2、MongoDB的增刪改查web
3、MongoDB的數據類型數據庫
4、MongoDB的關鍵字及修改器數組
5、python下使用MongoDB(pyMongo)數據結構
1、Mongodb簡介併發
瞭解MongoDB先了解什麼是非關係型數據庫(what):app
NoSQL,泛指非關係型的數據庫。隨着互聯網web2.0網站的興起,傳統的關係數據庫在應付web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了不少難以克服的問題,而非關係型的數據庫則因爲其自己的特色獲得了很是迅速的發展。NoSQL數據庫的產生就是爲了解決大規模數據集合多重數據種類帶來的挑戰,尤爲是大數據應用難題。分佈式
什麼是MongoDB數據庫(what):高併發
MongoDB 是一個基於分佈式文件存儲的數據庫。由 C++ 語言編寫。旨在爲 WEB 應用提供可擴展的高性能數據存儲解決方案。
MongoDB 是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。
它和咱們使用的關係型數據庫最大的區別就是約束性,能夠說文件型數據庫幾乎不存在約束性,理論上沒有主外鍵約束,沒有存儲的數據類型約束等等
關係型數據庫中有一個 "表" 的概念,有 "字段" 的概念,有 "數據條目" 的概念
MongoDB中也一樣有以上的概念,可是名稱發生了一些變化,嚴格意義上來講,二者的概念即爲類似,但又有些出入。
舉個例子:
下面咱們作一張表:
這是咱們用關係型數據庫作的一張很簡單的User表對吧
接下來咱們再看一下MongoDB的數據結構:
這......這特麼不就是個列表,裏面放着三個字典嗎?你說的對,若是你理解成了列表和字典,那麼證實了你只會Python,在其餘語言中它又是別的類型了,咱們把這種類型的玩意兒,叫作:Json
那麼你就該恍然大悟了吧,MongoDB的每一個表(Collection)中存儲的每條數據(Documents)都是一個一個的Json,Json中的每個字段(Key)咱們稱之爲:Field
就此咱們引出了三個關鍵字,Collection也就是關係型數據庫中"表"的概念,Documents就是"數據條目",Field就是"字段"。
2、MongoDB的增刪改查
增刪改查以前須要先建立一個數據庫
1.use+數據庫名
MongoDB設計的比較隨意,沒有就認爲你是在建立,use LuffyCity_Com是不存在的,因此MongoDB就認爲你是要建立並使用。
!!!後續這個概念必定要記住了:MongoDB中若是你使用了不存在的對象,那麼就等於你在建立這個對象!!!
2.切換數據庫
3.建立MongoDB中的表Collections
4.查看當前數據庫的表
你會發現剛纔建立的users表居然仍是查不到,這是由於show tables是查看物理磁盤上的,而不會查看內存等虛擬磁盤上的
【增長數據】
1.insert:插入一條或者多條數據,須要帶有容許插入多條的參數,這個方法目前官方已經不推薦嘍
db.users.insert({"name":"xujiayu","age":26})
2.insertOne: 插入一條數據,官方推薦
db.users.insertOne({"name":"neymar","age":26})
3.insertMany:插入多條數據,無需參數控制,官方推薦
db.users.insertMany([{"name":"bbb","age":29},{"name":"aaa","age":18}])
咱們插入了幾條數據後,再show tables看看,這時候數據存在了
【查詢數據】
插入完以後固然要查詢數據
1.find() 無條件查找:將該表(Collection)中全部的數據一次性返回
db.users.find()
2.db.數據庫名.find(對應條件)條件查找:name等於WuSir2b的數據,這裏會返回多條結果
db.users.find({"name":"neymar"})
"_id":ObjectId("亂七八糟一道對看着毫無關係的一對字符串") 是什麼,咱們插入的時候並無一個字段(Field)並無_id這個,
這就是MongoDB自動給咱們添加到系統惟一標識"_id" 是一個ObjectId 類型,下一章節會介紹到數據類型
3.findOne()無條件查找一條數據,默認當前Collection中的第一條數據
db.users.findOne()
4.findOne(加條件)條件查找一條age等於19的數據,若有多條數據則返回更靠前的數據
db.users.findOne({"age":26})
【修改數據】
查詢完數據發現錯誤要改怎麼辦
1.update({"name":"DragonFire"},{$set:{"age":21}}):根據條件修改該條數據的內容
意思是把名字是aaa的人的年齡改爲2222,若是條件爲空,那麼將會修改Collection中全部的數據
db.users.update({"name":"aaa"},{$set:{"age":2222}})
2.updateOne({"age":19},{$set:{"name":"WSSB"}}):根據條件修改一條數據的內容,如出現多條,只修改最高前的數據
db.users.updateOne({"name":"aaa"},{$set:{"age":1111}})
3.updateMany({"age":19},{$set:{"name":"pig_qi"}}):根據條件修改全部數據的內容,多條修改
那麼咱們以前說過MongoDB的靈活性,沒有就表明我要建立,因此說若是該條Documents沒有name屬性,他就會自動建立一個name屬性而且賦值爲"WSSB"
【刪除數據】
改了半天想刪除
1.remove({}):無條件刪除數據,這裏要注意了,這是刪除全部數據,清空Collection
db.users.remove({})
2.remove({"name":"aaa"}) : 條件刪除name等於"aaa"的全部Document
db.users.remove({"name":"aaa"})
3、MongoDB的數據類型
首先咱們要先了解一下MongoDB中有什麼樣的數據類型:
Object ID :Documents 自生成的 _id
String: 字符串,必須是utf-8
Boolean:布爾值,true 或者false (這裏有坑哦~在咱們大Python中 True False 首字母大寫)
Integer:整數 (Int32 Int64 大家就知道有個Int就好了,通常咱們用Int32)
Double:浮點數 (沒有float類型,全部小數都是Double)
Arrays:數組或者列表,多個值存儲到一個鍵 (list哦,大Python中的List哦)
Object:若是你學過Python的話,那麼這個概念特別好理解,就是Python中的字典,這個數據類型就是字典
Null:空數據類型 , 一個特殊的概念,None Null
Timestamp:時間戳
Date:存儲當前日期或時間unix時間格式 (咱們通常不用這個Date類型,時間戳能夠秒殺一切時間類型)
1.Object ID
"_id" : ObjectId("5b151f8536409809ab2e6b26""_id" : ObjectId("5be7df276a9e57f00fbcea02" #"5b151f85" 代指的是時間戳,這條數據的產生時間 #"364098" 代指某臺機器的機器碼,存儲這條數據時的機器編號 #"09ab" 代指進程ID,多進程存儲數據的時候,很是有用的 #"2e6b26" 代指計數器,這裏要注意的是,計數器的數字可能會出現重複,不是惟一的 #以上四種標識符拼湊成世界上惟一的ObjectID #只要是支持MongoDB的語言,都會有一個或多個方法,對ObjectID進行轉換 #能夠獲得以上四種信息 #注意:這個類型是不能夠被JSON序列化的
0-8字節是時間戳,
9-14字節的機器標識符,表示MongoDB實例所在機器的不一樣;
15-18字節的進程id,表示相同機器的不一樣MongoDB進程。
19-24字節是計數器
2.String
UTF-8字符串,記住是UTF-8字符串
3.Boolean
true or false 這裏首字母是小寫的
4.Integer
整數 (Int32 Int64 大家就知道有個Int就好了,通常咱們用Int32)
5.Double
浮點數 (MongoDB中沒有float類型,全部小數都是Double)
6.Arrays
{ "_id" : ObjectId("5be7e1d36a9e57f00fbcea06"), "name" : "xujiayu", "age" : 26, "aaa" : true, "salary" : 12000.1, "hobby" : [ "football", "basketball" ] }
7.Object
{ "_id" : ObjectId("5b163915993ddc4cd4918eaf"), "name" : "LuffyCity", "course" : { "name" : "Python", "price" : 19800 } }
8.Null
{ "_id" : ObjectId("5b163a0e993ddc4cd4918eb0"), "name" : "LuffyCity", "course" : null }
空數據類型 , 一個特殊的概念,None Null
9.Timestamp
{ "_id" : ObjectId("5b163bbf993ddc4cd4918eb3"), "name" : "LuffyCity", "date" : 1528183743111 }
10.Date
{ "_id" : ObjectId("5b163ba1993ddc4cd4918eb2"), "name" : "LuffyCity", "date" : ISODate("2018-06-05T15:28:33.705+08:00") }
4、MongoDB的關鍵字及修改器
1.查詢中常見的 等於 大於 小於 大於等於 小於等於
等於 : 在MongoDB中什麼字段等於什麼值其實就是 " : " 來搞定 好比 "name" : "neymar"
大於 : 在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的
關鍵字
$or : db.users.find({$or:[{age:18},{name:"銀網吧"}]})
$and : ,
$in : db.users.find({age:{$in:[18,84,73]}})
$all : db.users.find({hobby:{$all:[1,2,3,4,5,6]}})
2.MongoDB中的那些個update修改器: $inc $set $unset $push $pull
在此前的update中,咱們用過$set,對數據進行過更新,其實在update中還存在不少的$關鍵字,咱們把update中的這些關鍵字叫作 修改器
修改器不少,這裏挑一些重要的來講一說:
(1)$inc : Python中的 變量 += 1 , 將查詢到的結果 加上某一個值 而後保存
仍是剛纔Collection數據,咱們來試一下$inc , 讓工資12000.1的人的工資加1元
若是要減去多少直接加個負號就行{$inc:{"salary":20}}
(2)$set : 此前咱們已經提到過 $set 的用法和特性(沒有就自動添加一條)了
(3)$unset : 用來刪除Key(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的話, 知足條件的數據下標位置就會傳遞到 $ 字符中,在咱們更新操做的時候就至關於 對這個位置 的元素進行操做
5、python下使用MongoDB(pyMongo)