MongoDB簡介 MongoDB 是一個基於分散式文件存儲的資料庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。 MongoDB 是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。 MongoDB屬於NoSQL 在高負載 ...
MongoDB簡介
MongoDB 是一個基於分散式文件存儲的資料庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。
MongoDB 是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。
MongoDB屬於NoSQL
在高負載的情況下,添加更多的節點,可以保證伺服器性能。
MongoDB 旨在為WEB應用提供可擴展的高性能數據存儲解決方案。
MongoDB 將數據存儲為一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔類似於 JSON 對象。欄位值可以包含其他文檔,數組及文檔數組。
類似於json的數據形式
MongoDB的主要特點
- MongoDB 是一個面向文檔存儲的資料庫,操作起來比較簡單和容易。
- 你可以在MongoDB記錄中設置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。
- 你可以通過本地或者網路創建數據鏡像,這使得MongoDB有更強的擴展性。
- 如果負載的增加(需要更多的存儲空間和更強的處理能力) ,它可以分佈在電腦網路中的其他節點上這就是所謂的分片。
- Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
- MongoDb 使用update()命令可以實現替換完成的文檔(數據)或者一些指定的數據欄位 。
- Mongodb中的Map/reduce主要是用來對數據進行批量處理和聚合操作。
- Map和Reduce。Map函數調用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數進行處理。
- Map函數和Reduce函數是使用Javascript編寫的,並可以通過db.runCommand或mapreduce命令來執行MapReduce操作。
- GridFS是MongoDB中的一個內置功能,可以用於存放大量小文件。
- MongoDB允許在服務端執行腳本,可以用Javascript編寫某個函數,直接在服務端執行,也可以把函數的定義存儲在服務端,下次直接調用即可。
- MongoDB支持各種編程語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
- MongoDB安裝簡單。
NoSQL簡介
NoSQL(NoSQL = Not Only SQL ),意即"不僅僅是SQL"。
在現代的計算系統上每天網路上都會產生龐大的數據量。
這些數據有很大一部分是由關係資料庫管理系統(RDBMS)來處理。 1970年 E.F.Codd's提出的關係模型的論文 "A relational model of data for large shared data banks",這使得數據建模和應用程式編程更加簡單。
通過應用實踐證明,關係模型是非常適合於客戶伺服器編程,遠遠超出預期的利益,今天它是結構化數據存儲在網路和商務應用的主導技術。
NoSQL 是一項全新的資料庫革命性運動,早期就有人提出,發展至2009年趨勢越發高漲。NoSQL的擁護者們提倡運用非關係型的數據存儲,相對於鋪天蓋地的關係型資料庫運用,這一概念無疑是一種全新的思維的註入。
NoSQL,指的是非關係型的資料庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同於傳統的關係型資料庫的資料庫管理系統的統稱。
NoSQL用於超大規模數據的存儲。(例如谷歌或Facebook每天為他們的用戶收集萬億比特的數據)。這些類型的數據存儲不需要固定的模式,無需多餘操作就可以橫向擴展。
下載安裝MongoDB
官網鏈接 https://www.mongodb.com/download-center?jmp=nav
啟動MongoDB
啟動之前要先添加環境變數
MongoDB服務端啟動的命令為mongod
配置數據存放的位置, 服務就可以正常的啟動
我將配置放在專門的配置文件中
dbpath=E:\mongodb_data\data
啟動時指定配置文件
mongod –config c:\mongodb\conf\master.cfg
MongoDB支持的數據類型
Object ID: 對象id "_id" : ObjectId("5b151f8536409809ab2e6b26") #"5b151f85" 代指的是時間戳,這條數據的產生時間 #"364098" 代指某台機器的機器碼,存儲這條數據時的機器編號 #"09ab" 代指進程ID,多進程存儲數據的時候,非常有用的 #"2e6b26" 代指計數器,這裡要註意的是,計數器的數字可能會出現重覆,不是唯一的 #以上四種標識符拼湊成世界上唯一的ObjectID #只要是支持MongoDB的語言,都會有一個或多個方法,對ObjectID進行轉換 #可以得到以上四種信息 #註意:這個類型是不可以被JSON序列化的 String: 字元串,必須是utf-8 db.table01.insertOne({"name": "sath"}) Boolean:布爾值,true 或者 false (這裡有坑哦~在我們Python中 True False 首字母大寫) db.teble01.insertOne({"status": true}) Integer:整數 (Int32 Int64 你們就知道有個Int就行了 ,一般我們用Int32) db.table01.insert({"age":parseInt("100")}) # 字元串會被轉成int32 Double:浮點數 (沒有float類型,所有小數都是Double) 預設是添加的所有的數數字都是Double Arrays:數組或者列表,多個值存儲到一個鍵 (list哦,大Python中的List哦) db.table01.insert({"hobby":["python","go", "java"]}) Object:如果你學過Python的話,那麼這個概念特別好理解,就是Python中的字典,這個數據類型就是字典 db.table01.insert({"1": {"name":"sath", "age":35}}) Null:空數據類型 , 一個特殊的概念,None Null db.table01.insert({"is_null": null}) Timestamp:時間戳 db.table01.insert({"t_time":new Date().valueOf()}) Date:存儲當前日期或時間unix時間格式 (我們一般不用這個Date類型,時間戳可以秒殺一切時間類型) db.table01.insert({"t_time":Date()}) Mon Dec 24 2018 19:23:34 GMT+0800 db.table01.insert({"t_time":new Date()}) 2018/12/24 下午19:23:19
MongoDB常用語法
增
增 1. db.table01.insert({"name":"wangjianwei", "age":22}) # 官方不推薦 # 官方推薦以下兩種方式 2. 插入一條數據 db.insertOne({"name":"zhangsan", "age":78}) # 會返回添加進去的對象 { "acknowledged" : true, "insertedId" : ObjectId("5c2091e508d12e25ff01af8d") } 3. 插入多條數據 db.table01.insertMany([{"name":"zhangsan", "age":78},{"name":"lisi", "age":36}]) { "acknowledged" : true, "insertedIds" : [ ObjectId("5c20924e08d12e25ff01af8e"), ObjectId("5c20924e08d12e25ff01af8f") ] }
刪
刪 1. 刪除所有 db.table01.remove({}) 官方推薦寫法 2. 刪除一個 db.table01.deleteOne({"hobby":{$all:["抽煙"]}}) 3.刪除所有匹配到的 db.table01.deleteMany({"hobby":{$all:["抽煙"]}}) 4. 刪除表 db.table01.drop()
改
改 語法格式: db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } ) query : update的查詢條件 update : 要更新的內容 upsert : 可選,這個參數的意思是,如果不存在當前更新的記錄,是否插入你要更新的值到數據中,預設是false,不插入。 multi : 可選,mongodb 預設是false,只更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。 writeConcern :可選,拋出異常的級別。 官方推薦的寫法 更新第一條數據 db.table01.updateOne({"age":{$gt:70}}, {$set:{"age":0}}) 更新所有的數據 db.table01.updateMany({"age":{$gt:70}}, {$set:{"age":0}})
查
1. 查詢所有 db.table01.find() 2. db.table01.find().pretty() # 當查詢到的結果可讀性更高 3. 根據條件查詢 db.table01.find({"age":78}) # find後面可以跟條件 4. 多個條件之間使用and的關係 db.table01.find({"age":78, "name": "wangwu"}) # 多個條件之間是and的關係 5. 多個條件之間使用or關係 db.table01.find({$or:[{"age":78},{"name":"zhangsan"}]} 多個條件放在列表中, 每一個條件是一個字典 6. and和or一塊使用 db.table01.find({"addr":"ShangHai",$or:[{"name":"sath"},{"age": 88}]}) 7. in條件查詢 db.table01.find({"name": {$in: ["zhangsan", "sath"]}}) name的值在某個列表中 8. 比較大小的方法 8.1 大於 db.table01.find({"age": {$gt: 60}}) 8.2 大於等於 db.table01.find({"age": {$gte: 53}}) 8.3 小於 db.table01.find({"age": {$lt: 53}}) 8.4 小於等於 db.table01.find({"age": {$lte: 36}}) 8.5 不等於 db.table01.find({"age": {$ne: 53}}) 8.6 等於 db.table01.find({"age": {$eq: 53}}) db.table01.find({"age":53}) 8.7 9. db.table01.find({"hobby":{$all:["喝酒", "燙頭"]}}) # all: 包含列表中所有的條件的
10.
db.table01.find({"name":"lisi"}, {"age":0})
# 過濾條件為name=lisi, 後面的age=0 表示查詢的結果中不要age的值,
# 使用find或者findOne都可以加這個條件, pymongo也是一樣
10.模糊匹配
db.col.find({title: {"$regex": "59450"}})
db.col.find({title:/教/}) # 模糊匹配
db.col.find({title:/^教/}) # 匹配開頭
db.col.find({title:/教$/}) # 匹配末尾
備份與恢復
備份
保證資料庫正在運行 mongodump -h 127.0.0.1 -o E:\db # 備份所有的資料庫 mongodump --collection table01 --db day120 -o E:\db2 # 備份指定資料庫中的的指定集合(表)
常用參數
-h: MongDB所在伺服器地址,例如:127.0.0.1,當然也可以指定埠號:127.0.0.1:27017 -d: 需要備份的資料庫實例,例如:test -o: 備份的數據存放位置,例如:c:\data\dump,當然該目錄需要提前建立,在備份完成後,系統自動在dump目錄下建立一個test目錄,這個目錄裡面存放該資料庫實例的備份數據。
恢復
mongorestore -h 127.0.0.1 E:\db
常用參數
--host <:port>, -h <:port>: MongoDB所在伺服器地址,預設為: localhost:27017 --db , -d : 需要恢復的資料庫實例,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2 --drop: 恢復的時候,先刪除當前數據,然後恢復備份的數據。就是說,恢復後,備份後添加修改的數據都會被刪除,慎用哦! <path>: mongorestore 最後的一個參數,設置備份數據所在位置,例如:c:\data\dump\test。 你不能同時指定 <path> 和 --dir 選項,--dir也可以設置備份目錄。 --dir: 指定備份的目錄 你不能同時指定 <path> 和 --dir 選項。
參考: http://www.runoob.com/mongodb/mongodb-intro.html