一 簡介
MongoDB是一款強大、靈活、且易於擴展的通用型數據庫
一、易用性html
MongoDB是一個面向文檔(document-oriented)的數據庫,而不是關係型數據庫。
不採用關係型主要是爲了得到更好得擴展性。固然還有一些其餘好處,與關係數據庫相比,面向文檔的數據庫再也不有「行「(row)的概念取而代之的是更爲靈活的「文檔」(document)模型。
經過在文檔中嵌入文檔和數組,面向文檔的方法可以僅使用一條記錄來表現複雜的層級關係,這與現代的面嚮對象語言的開發者對數據的見解一致。
另外,再也不有預約義模式(predefined schema):文檔的鍵(key)和值(value)再也不是固定的類型和大小。因爲沒有固定的模式,根據須要添加或刪除字段變得更容易了。一般因爲開發者可以進行快速迭代,因此開發進程得以加快。並且,實驗更容易進行。開發者能嘗試大量的數據模型,從中選一個最好的。
二、易擴展性python
應用程序數據集的大小正在以難以想象的速度增加。隨着可用帶寬的增加和存儲器價格的降低,即便是一個小規模的應用程序,須要存儲的數據量也可能大的驚人,甚至超出
了不少數據庫的處理能力。過去很是罕見的T級數據,如今已是司空見慣了。
因爲須要存儲的數據量不斷增加,開發者面臨一個問題:應該如何擴展數據庫,分爲縱向擴展和橫向擴展,縱向擴展是最省力的作法,但缺點是大型機通常都很是貴,並且
當數據量達到機器的物理極限時,花再多的錢也買不到更強的機器了,此時選擇橫向擴展更爲合適,但橫向擴展帶來的另一個問題就是須要管理的機器太多。
MongoDB的設計採用橫向擴展。面向文檔的數據模型使它能很容易地在多臺服務器之間進行數據分割。MongoDB可以自動處理跨集羣的數據和負載,自動從新分配文檔,以及將
用戶的請求路由到正確的機器上。這樣,開發者可以集中精力編寫應用程序,而不須要考慮如何擴展的問題。若是一個集羣須要更大的容量,只須要向集羣添加新服務器,MongoDB就會自動將現有的數據向新服務器傳送
三、豐富的功能數據庫
MongoDB做爲一款通用型數據庫,除了可以建立、讀取、更新和刪除數據以外,還提供了一系列不斷擴展的獨特功能 #一、索引 支持通用二級索引,容許多種快速查詢,且提供惟一索引、複合索引、地理空間索引、全文索引 #二、聚合 支持聚合管道,用戶能經過簡單的片斷建立複雜的集合,並經過數據庫自動優化 #三、特殊的集合類型 支持存在時間有限的集合,適用於那些將在某個時刻過時的數據,如會話session。相似地,MongoDB也支持固定大小的集合,用於保存近期數據,如日誌 #四、文件存儲 支持一種很是易用的協議,用於存儲大文件和文件元數據。MongoDB並不具有一些在關係型數據庫中很廣泛的功能,如連接join和複雜的多行事務。省略 這些的功能是處於架構上的考慮,或者說爲了獲得更好的擴展性,由於在分佈式系統中這兩個功能難以高效地實現
二 MongoDB基礎知識
一、文檔是MongoDB的核心概念。文檔就是鍵值對的一個有序集{'msg':'hello','foo':3}。相似於python中的有序字典。json
須要注意的是: #一、文檔中的鍵/值對是有序的。 #二、文檔中的值不只能夠是在雙引號裏面的字符串,還能夠是其餘幾種數據類型(甚至能夠是整個嵌入的文檔)。 #三、MongoDB區分類型和大小寫。 #四、MongoDB的文檔不能有重複的鍵。 #五、文檔中的值能夠是多種不一樣的數據類型,也能夠是一個完整的內嵌文檔。文檔的鍵是字符串。除了少數例外狀況,鍵可使用任意UTF-8字符。 文檔鍵命名規範: #一、鍵不能含有\0 (空字符)。這個字符用來表示鍵的結尾。 #二、.和$有特別的意義,只有在特定環境下才能使用。 #三、如下劃線"_"開頭的鍵是保留的(不是嚴格要求的)。
二、集合就是一組文檔。若是將MongoDB中的一個文檔比喻爲關係型數據的一行,那麼一個集合就是至關於一張表數組
#一、集合存在於數據庫中,一般狀況下爲了方便管理,不一樣格式和類型的數據應該插入到不一樣的集合,但其實集合沒有固定的結構,這意味着咱們徹底能夠把不一樣格式和類型的數據通通插入一個集合中。 #二、組織子集合的方式就是使用「.」,分隔不一樣命名空間的子集合。 好比一個具備博客功能的應用可能包含兩個集合,分別是blog.posts和blog.authors,這是爲了使組織結構更清晰,這裏的blog集合(這個集合甚至不須要存在)跟它的兩個子集合沒有任何關係。 在MongoDB中,使用子集合來組織數據很是高效,值得推薦 #三、當第一個文檔插入時,集合就會被建立。合法的集合名: 集合名不能是空字符串""。 集合名不能含有\0字符(空字符),這個字符表示集合名的結尾。 集合名不能以"system."開頭,這是爲系統集合保留的前綴。 用戶建立的集合名字不能含有保留字符。有些驅動程序的確支持在集合名裏面包含,這是由於某些系統生成的集合中包含該字符。除非你要訪問這種系統建立的集合,不然千萬不要在名字裏出現$。
三、數據庫:在MongoDB中,多個文檔組成集合,多個集合能夠組成數據庫服務器
數據庫也經過名字來標識。數據庫名能夠是知足如下條件的任意UTF-8字符串: #一、不能是空字符串("")。 #二、不得含有' '(空格)、.、$、/、\和\0 (空字符)。 #三、應所有小寫。 #四、最多64字節。 有一些數據庫名是保留的,能夠直接訪問這些有特殊做用的數據庫。 #一、admin: 從身份認證的角度講,這是「root」數據庫,若是將一個用戶添加到admin數據庫,這個用戶將自動得到全部數據庫的權限。再者,一些特定的服務器端命令也只能從admin數據庫運行,如列出全部數據庫或關閉服務器 #二、local: 這個數據庫永遠都不能夠複製,且一臺服務器上的全部本地集合均可以存儲在這個數據庫中 #三、config: MongoDB用於分片設置時,分片信息會存儲在config數據庫中
四、強調:把數據庫名添加到集合名前,獲得集合的徹底限定名,即命名空間session
5,只支持json數據,key和values對應的關係架構
三 安裝分佈式
dengd.......post
練習:
MongoDB 是一個面向文檔的數據庫,是非關係型數據庫 數據庫操做: -建立 use 數據庫名 (有則進入,無則建立,若是沒數據,show dbs是看不到的數據庫的) - 刪除 -use config #先切換到要刪的庫下 -db.dropDatabase() #刪除當前庫 #一、增 use config #若是數據庫不存在,則建立數據庫,不然切換到指定數據庫。 #二、查 show dbs #查看全部 能夠看到,咱們剛建立的數據庫config並不在數據庫的列表中, 要顯示它,咱們須要向config數據庫插入一些數據。 db.table1.insert({'a':1}) 集合操做(相似於表,表操做) -建立 -在表中插入一條數據,就自動建立了 -db在那個庫中,db就是就是誰 -db.table1.insert({"name":"lxx","age":18}) -db.table1.insert({"name":"lxx","age":18,"sex":"男"}) -show dbs 這個數據庫就能看到了 -show tables 這個表就能看到了 -刪除 -db.table2.drop() 據行,文檔操做 -新增 -db.table1.insert({"name":"lqz","age":18}) -先定義出一個對象(字典),db.table1.insert(字典名)###### -插入多條 -db.table1.insertMany([user1,user2,user3,user4,user5]) -查詢 db.table1.find() -一、select * from db1.user where name = "egon"; db.table1.find({name:"egon"}) -select * from db1.user where name != "alex"; db.table1.find({name:{"$ne":"egon"}}) -不等於,大於,小於,大於等於,小於等於 -$ne $gt $lt $gte $lte -db.table1.find({"_id":{"$gte":2,}}) -db.table1.find({'_id':{"$mod":[2,1]}}) # 求餘 db.table.find({'_id':{"$not":{"$mod":[2,1]}}}) -db.table1.find({"age":{"$in":[20,30,31]}}) -db.table.find({'name':/^j.*?(g|n)$/i}) -db.table.find({'_id':3},{'_id':0,'name':0,'age':1}) -db.table1.find({"hobbies.3":'tea'}) -db.table1.find({"hobbies.0":'music'}) -db.table1.find({},{'hobbies':{"$slice":-2},"age":1,"_id":0,"name":0,"addr":0}) -db.table1.find({},{'hobbies':{"$slice":-2}}) -db.table1.find({},{'hobbies':{"$slice":[1,2]},}) -db.user.find().sort({"_id":1,}) -db.user.find().sort({'_id':1}).limit(2).skip(4) -db.table1.find({'age':{"$gt":30}}).count() 12 34 45 修改 -db.user.update({'age':20},{"name":"Wxx","hobbies_count":3}) 覆蓋式的 -db.table1.update({'_id':2},{"$set":{"name":"WXX",}}) 不覆蓋 -db.table1.update({'_id':6},{"$set":{"name":"egon","age":18}},{"upsert":true}) -db.table1.update({}, { "$inc":{"age":-5} }, { "multi":true } ) """ # 下載pymongo from pymongo import MongoClient # 1,鏈接 client = MongoClient('localhost',27017) # 2 use 數據庫 # db=client['db2'] #等同於:client.db1 db = client.test # 查看庫下全部集合 print(db.collection_names(include_system_collections=False)) table_user = db['table1'] # 等同於db. # table1=db.table1 # #五、插入文檔 import datetime # user0={ # "_id":1, # "name":"egon", # "birth":datetime.datetime.now(), # "age":10, # 'hobbies':['music','read','dancing'], # 'addr':{ # 'country':'China', # 'city':'BJ' # } # } # # user1={ # "_id":2, # "name":"alex", # "birth":datetime.datetime.now(), # "age":10, # 'hobbies':['music','read','dancing'], # 'addr':{ # 'country':'China', # 'city':'weifang' # } # } # res=table_user.insert_many([user0,user1]) # res=table_user.insert_many # print(res) # print(table_user.count()) #六、查找 # from pprint import pprint#格式化細 # pprint(table_user.find_one()) # for item in table_user.find(): # pprint(item) # # print(table_user.find_one({"_id":{"$gte":1},"name":'egon'})) # table_user.find() # #七、更新 table_user.update({'_id':1},{'name':'EGON'}) print(table_user.find()) # #八、傳入新的文檔替換舊的文檔 # table_user.save( # { # "_id":2, # "name":'egon_xxx' # } # )