1. 程式人生 > >MongoDB 安裝詳細教程 + 常用命令 + 與 Python 的互動

MongoDB 安裝詳細教程 + 常用命令 + 與 Python 的互動

MongoDB 簡介
MongoDB (名稱來自 humongous/巨大無比的, 是一個可擴充套件的高效能,開源,模式自由,面向文件的NoSQL,基於 分散式 檔案儲存,由 C++ 語言編寫,設計之初旨在為 WEB 應用提供可擴充套件的高效能資料儲存解決方案。

MongoDB使用的是記憶體對映儲存引擎,它會把磁碟IO操作轉換成記憶體操作,如果是讀操作,記憶體中的資料起到快取的作用,如果是寫操作,記憶體還可以把隨機的寫操作轉換成順序的寫操作,大幅度提升效能。

MongoDB 既擁有Key-Value儲存方式的高效能和高度伸縮性,也擁有傳統的RDBMS系統的豐富的功能,集兩者的優勢於一身。 介於關係資料庫和NoSQL之間,也是功能最豐富、最像關係資料庫的的NoSQL。

MongoDB官方文件:https:
//docs.mongodb.com MongoDB中文社群:http://www.mongoing.com MongoDB特點 模式自由 :可以把不同結構的文件儲存在同一個資料庫裡 面向集合的儲存:適合儲存 JSON風格檔案的形式, 完整的索引支援:對任何屬性可索引, 複製和高可用性:支援伺服器之間的資料複製,支援主-從模式及伺服器之間的相互複製。複製的主要目的是提供冗餘及自動故障轉移。 自動分片:支援水平的資料庫叢集,可動態新增額外的機器。 豐富的查詢:支援豐富的查詢表達方式,查詢指令使用JSON形式的標記,可輕易查詢文件中的內嵌的物件及陣列。 快速就地更新:查詢優化器會分析查詢表示式,並生成一個高效的查詢計劃。 高效的傳統儲存方式:支援二進位制資料及大型物件(如圖片等...)。 根據DB
-Engines的排名統計,MongoDB綜合排名第五(2017年10月資料,前四名分別是Oracle,MySQL,SQL Server,PostgreSQL),在NoSQL領域(非RDBMS)裡排名第一。 適用場景 網站資料: 適合實時的插入,更新與查詢,並具備網站實時資料儲存所需的複製及高度伸縮性。 快取: 由於效能很高,也適合作為資訊基礎設施的快取層。在系統重啟之後,搭建的持久化快取可以避免下層的資料來源過載。 大尺寸、低價值的資料: 使用傳統的關係資料庫儲存一些資料時可能會比較貴,在此之前,很多程式設計師往往會選擇傳統的檔案進行儲存。 高伸縮性的場景: 非常適合由數十或者數百臺伺服器組成的資料庫。 用於物件及JSON資料的儲存: MongoDB的BSON資料格式非常適合文件格式化的儲存及查詢。 不適用的場景 高度事物性的系統: 例如銀行或會計系統。傳統的關係型資料庫目前還是更適用於需要大量原子性複雜事務的應用程式。 傳統的商業智慧應用: 針對特定問題的BI資料庫會對產生高度優化的查詢方式。對於此類應用,資料倉庫可能是更合適的選擇。 需要使用SQL語句解決的場景: MongoDB不支援SQL語句。 商業應用 京東:使用MongoDB儲存商品資訊,支援比價和關注功能. 百度雲:使用MongoDB管理百度雲盤中500億條關於檔案源資訊的記錄. CERN:著名的粒子物理研究所,歐洲核子研究中心大型強子對撞機的資料使用MongoDB儲存。 The New York Times:世界領先的線上新聞入口網站之一,使用MongoDB作為內容儲存。 sourceforge.net,資源網站查詢,建立和釋出開源軟體免費,使用MongoDB做後端儲存。 一.MongoDB的安裝 下載mongodb的版本,兩點注意 根據業界規則,偶數為穩定版,如3.
2.X;奇數為開發版,如3.3.X 32bit的mongodb最大隻能存放2G的資料,64bit就沒有限制 MongoDB官網安裝包下載地址:http://www.mongodb.org/downloads MongoDB安裝文件:https://docs.mongodb.com/getting-started/shell/installation/ Ubuntu下安裝MongoDB: sudo apt-get install mongodb 使用MongoDB,需要先啟動服務端,再使用客戶端連線資料庫。 1. 服務端 MongoDB 預設的儲存資料目錄為 /data/db,預設埠27017 服務的命令為mongod,可以通過help檢視所有引數 [email protected]:~$ mongod --help 相關檔案存放路徑:預設各個檔案存放路徑如下所示: 可執行檔案存放路徑:/usr/bin/mongod 和 /usr/bin/mongo 預設資料庫檔案存放路徑:/var/lib/mongodb 預設日誌檔案存放路徑:/var/log/mongodb/mongodb.log 配置檔案預設存放路徑:/etc/mongodb.conf 可以通過修改配置檔案修改資料檔案和日誌檔案的存放路徑 mongod 是與伺服器端相關的執行檔案 mongo 是與客戶端相關的執行檔案 a.啟動MongoDB服務: cd /usr/bin ./mongod --dbpath=/var/lib/mongodb --logpath=/var/log/mongodb/mongodb.log --auth --logappend --port=27017 --fork dbpath 儲存位置, logpath 日誌路徑,logappend追加形式,port埠號,fork啟動. b.停止mongdb pkill mongod MongoDB中提供了一種後臺程式方式啟動的選擇,只需要加上-fork引數即可但是注意:用到如果了--fork引數,必須就啟用--logpath引數來指定日誌檔案,這是強制的。 如果使用--fork在後臺執行mongdb服務,那麼就要通過本機管理資料庫向伺服器傳送shutdownServer()訊息來關閉。 2. 在客戶端 進行使用者建立 啟用使用者認證方式啟動 1.如果之前未定義過使用者,所以mongod的將允許本地直接訪問操作資料庫將使用本地根許可權, 2.如果使用--auth引數啟動,將啟用的MongoDB授權認證,即啟用不同的使用者對不同的資料庫的操作許可權。 也可以在配置檔案mongod.conf中加入auth = true按第二種啟動方式啟動。 cd /usr/bin ./mongo a. 切換admin資料庫下 show databases use admin b. 建立一個擁有root許可權的超級使用者,擁有所有資料庫的所有許可權 db.createUser({user : "lowman", pwd : "lowman9527", roles : ["root"]}) c. 如果 MongoDB 開啟了許可權模式,並且某一個數據庫沒有任何使用者時,可以不用認證許可權並建立一個使用者,但是當繼續建立第二個使用者, 會返回錯誤,若想繼續建立使用者則必須認證登入。 認證登入到lowman使用者(第一次建立的使用者) db.auth("lowman","lowman9527") 檢視當前認證登入的使用者資訊 show users 認證登入成功,可以繼續建立第二個使用者 db.createUser({user : "lowman2", pwd : "123456", roles : [{role : "read", db : "test_database"}, {role : "readWrite", db : "test_databases"}]}) 檢視當前資料庫下所有的使用者資訊 db.system.users.find() d. 刪除使用者 db.dropUser("使用者名稱") 3. 要獲得關於MongoDB中的伺服器統計,需要在MongoDB的客戶端鍵入命令db.stats()。這將顯示資料庫名稱,收集和資料庫中的文件資訊。輸出的命令如下所示 "db" : "test" ,表示當前是針對"test"這個資料庫的描述。想要檢視其他資料庫,可以先執行$ use datbasename "collections" : 3,表示當前資料庫有多少個collections.可以通過執行show collections檢視當前資料庫具體有哪些collection. "objects" : 267,表示當前資料庫所有collection總共有多少行資料。顯示的資料是一個估計值,並不是非常精確。 "avgObjSize" : 623.2322097378277,表示每行資料是大小,也是估計值,單位是bytes "dataSize" : 16640,表示當前資料庫所有資料的總大小,不是指佔有磁碟大小。單位是bytes "storageSize" : 110592,表示當前資料庫佔有磁碟大小,單位是bytes,因為mongodb有預分配空間機制,為了防止當有大量資料插入時對磁碟的壓力,因此會事先多分配磁碟空間。 "numExtents" : 0,沒有什麼真實意義 "indexes" : 2 ,表示system.indexes表資料行數。 "indexSize" : 53248,表示索引佔有磁碟大小。單位是bytes "ok" : 1,表示伺服器正常 二.MongoDB快速入門 MongoDB 將資料儲存為一個文件,資料結構由鍵值(key=>value)對組成。MongoDB 文件類似於 JSON 物件。欄位值可以包含其他文件,陣列及文件陣列。 1. 資料庫 資料庫是一個集合的物理容器。一個單一的MongoDB伺服器通常有多個數據庫。如自帶的admin、test,或自行建立的資料庫。 2. 集合 也稱為文件組,類似於關係資料庫中的表格。 集合存在於資料庫中,一個數據庫可以包含很多個集合。集合沒有固定的結構,這意味著你在對集合可以插入不同格式和型別的資料,但通常情況下我們插入集合的資料都會有一定的關聯性。 當第一個文件資料插入時,集合就會被建立。 3. 文件 MongoDB使用了BSON(Binary JSON)這種結構來儲存資料,並把這種格式轉化成了文件這個概念,每個文件是一組 鍵 : 值 的資料。 4. 資料庫基本命令 連線成功後,預設使用test資料庫 檢視當前資料庫名稱 db 檢視所有資料庫名稱,列出所有在物理上存在的資料庫 show dbs 切換資料庫,如果資料庫不存在也並不建立,直到插入資料或建立集合時資料庫才被建立 use 資料庫名稱 刪除當前指向的資料庫,如果資料庫不存在,則什麼也不做 db.dropDatabase() 5. 集合命令 建立集合語法如下 name是要建立的集合的名稱 options是一個文件,用於指定集合的配置,選項​​引數是可選的,所以只需要到指定的集合名稱 可以不手動建立集合,向不存在的集合中第一次加入資料時,集合會被創建出來 db.createCollection(name, options) #例1:不限制集合大小 db.createCollection("stu") #例2:限制集合大小 - 引數capped:預設值為false表示不設定上限,值為true表示設定上限 - 引數size:當capped值為true時,需要指定此引數,表示上限大小,當文件達到上限時,會將之前的資料覆蓋,單位為位元組 示例: db.createCollection("stu", {capped : true, size : 6142800} ) 檢視當前資料庫的集合 show collections 刪除集合命令 db.集合名稱.drop() 6.資料型別 下面為MongoDB中常用的幾種資料型別: ObjectID:文件ID String:字串,最常用,必須是有效的UTF-8 Boolean:儲存一個布林值,true或false Integer:整數可以是32位或64位,這取決於伺服器 Double:儲存浮點值 Arrays:陣列或列表,多個值儲存到一個鍵 Object:用於嵌入式的文件,即一個值為一個文件 Null:儲存Null值 Timestamp:時間戳,表示從1970-1-1到現在的總秒數 Date:儲存當前日期或時間的UNIX時間格式 建立日期語句如下,注意引數的格式為YYYY-MM-DD Date('2017-12-20') ObjectID _id是一個12位元組的十六進位制數,保證每一份檔案的唯一性。你可以自己去設定_id插入文件。如果沒有提供,那麼MongoDB的每個文件提供了一個獨特的ID,這12個位元組: 前4個位元組為當前時間戳; 之後的3個位元組的機器ID; 接下來的2個位元組的MongoDB的服務程序id; 剩餘3個位元組是簡單的增量值 一個位元組等於2位十六進位制(一位十六進位制的數等於四位二進位制的數。一個位元組等於8位二進位制數) 三. 與python互動 0.設定mongodb允許遠端連線 vim /etc/mongodb.conf 把 bind_ip=127.0.0.1 修改成 bind_ip=0.0.0.0,允許所有ip連線(生產環境不建議), 或者指定ip 關閉伺服器對27017埠的防火牆,或者直接關閉系統防火牆(生產環境不建議) 1.sudo pip install pymongo 2. 官方文件: http://api.mongodb.com/python/current/tutorial.html 3. 引入包pymongo: import pymongo 4. 建立 MongoClient 物件 client = pymongo.MongoClient('主機ip',埠) 5. 獲取 Database 物件 通過client物件獲取獲得資料庫物件 db = client.資料庫名稱 6. 獲取 Collections 物件 通過db物件獲取集合物件 collections = db.集合名稱 主要方法如下: 增 insert_one:加入一條文件物件 insert_many:加入多條文件物件 刪 delete_one:刪除一條文件物件 delete_many:刪除多條文件物件 改 update_one:更新一條文件物件 update_many:更新多條文件物件 查 find_one:查詢一條文件物件 find:查詢多條文件物件 7. 使用示例 import pymongo from bson.objectid import ObjectId # 建立連線資料庫例項 client = pymongo.MongoClient("具體的ip", 27017) # 獲取資料庫物件, 如果是登入admin資料庫進行使用者認證,需要再獲取到相應的資料庫物件再進行crud操作 client.test db = client.test # 使用者認證, 使用者名稱稱和密碼需要擁有該資料庫相應的許可權 db.authenticate("lowman2", "123456") # 獲取集合物件 collection = db.stu # database = client.admin # database.authenticate("lowman", "lowman9527") # collection = client.test.stu # 定義文件 doc_1 = { "name1": "lowman", "age1": 18 } doc_2 = { "name2": "渣男", "age2": 98 } doc = [doc_1, doc_2] """ 增加資料 """ # 插入一條資料 # _id = collection.insert_one(doc_1).inserted_id # print(_id) # 一次性插入多條資料, 按插入的順序返回_id # callback_data = collection.insert_many(doc) # for id in callback_data.inserted_ids: # print(id) """ 刪除資料 """ # 刪除一條文件資料 # collection.delete_one({'age1': 18}) # 一次性刪除多條文件資料 # collection.delete_many({'name1': 'lowman'}) """ 修改資料 """ # 修改一條資料,首先查詢到 gender 為False 的文件, 然後將其name設定為 hehe # collection.update_one({'_id': "fa8sd68h54dsafg6qw87er"}, {'$set': {'name': 'hehe'}}) # 一次性修改多條資料 # collection.update_many({'gender':True},{'$set':{'name':'haha'}}) """ 查詢資料 """ # 查詢一條資料, 根據id查詢時,需要使用ObjectId()將字串id裝換為ObjectId # data = collection.find_one({'_id': ObjectId("5bf7fae1f86fe6048cc54be6")}) # print(data) # 查詢多條資料 # cursor = collection.find({'name1': 'lowman'}) # for item in cursor: # print(item["age1"])