本篇博客講帶大家瞭解MongoDB的理論知識,然後進行window系統MongoDB安裝,Docker 環境下MongoDB安裝。
什麼是MongoDB
MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。
MongoDB 同時也可以說是一個跨平臺的,面向文檔的數據庫,是當前 NoSQL 數據庫產品中最熱門的一種。它介於關係數據庫和非關係數據庫之間,是非關係數據庫當中功能最豐富,最像關係數據庫的產品。它支持的數據結構非常鬆散,是類似 JSON 的 BSON 格式,因此可以存儲比較複雜的數據類型。
在高負載的情況下,添加更多的節點,可以保證服務器性能。
MongoDB 旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。
MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔類似於 JSON 對象。字段值可以包含其他文檔,數組及文檔數組。
MongoDB 的官方網站地址是:http://www.mongodb.org/
MongoDB特點
MongoDB 最大的特點是他支持的查詢語言非常強大,其語法有點類似於面向對象的查詢語言,幾乎可以實現類似關係數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引。它是一個面向集合的,模式自由的文檔型數據庫。具體特點總結如下:
(1)面向集合存儲,易於存儲對象類型的數據
(2)模式自由
(3)支持動態查詢
(4)支持完全索引,包含內部對象
(5)支持複製和故障恢復
(6)使用高效的二進制數據存儲,包括大型對象(如視頻等)
(7)自動處理碎片,以支持雲計算層次的擴展性
(8)支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++語言的驅動程序,
社區中也提供了對 Erlang 及.NET 等平臺的驅動程序
(9) 文件存儲格式爲 BSON(一種 JSON 的擴展)
MongoDB體系結構
MongoDB的邏輯結構是一種層次結構。主要由:
文檔(document)、集合(collection)、數據庫(database)這三部分組成的。邏輯結構是面向用戶的,用戶使用 MongoDB 開發應用程序使用的就是邏輯結構。
(1)MongoDB 的文檔(document),相當於關係數據庫中的一行記錄。
(2)多個文檔組成一個集合(collection),相當於關係數據庫的表。
(3)多個集合(collection),邏輯上組織在一起,就是數據庫(database)。
(4)一個 MongoDB 實例支持多個數據庫(database)。
文檔(document)、集合(collection)、數據庫(database)的層次結構如下圖:
下表是MongoDB與MySQL數據庫邏輯結構概念的對比
MongoDB數據類型
基本數據類型
null:用於表示空值或者不存在的字段,{“x”:null}
布爾型:布爾類型有兩個值true和false,{“x”:true}
數值:shell默認使用64爲浮點型數值。{“x”:3.14}或{“x”:3}。對於整型值,可以使用NumberInt(4字節符號整數)或NumberLong(8字節符號整數), {“x”:NumberInt(“3”)}{“x”:NumberLong(“3”)}
字符串:UTF-8字符串都可以表示爲字符串類型的數據,{“x”:“呵呵”}
日期:日期被存儲爲自新紀元依賴經過的毫秒數,不存儲時區,{“x”:new Date()}
正則表達式:查詢時,使用正則表達式作爲限定條件,語法與JavaScript的正則表達式相同,{“x”: /[abc]/}
數組:數據列表或數據集可以表示爲數組,{“x”: [“a“,“b”,”c”]}
內嵌文檔:文檔可以嵌套其他文檔,被嵌套的文檔作爲值來處理,{“x”:{“y”:3 }} 對象Id:對象id是一個12字節的字符串,是文檔的唯一標識,{“x”: objectId() }
二進制數據:二進制數據是一個任意字節的字符串。它不能直接在shell中使用。如果要將非utf-字符保存到數據庫中,二進制數據是唯一的方式。
代碼:查詢和文檔中可以包括任何JavaScript代碼,{“x”:function(){/…/}}
什麼樣的功能適合使用MongoDB
吐槽和評論兩項功能存在以下特點:
(1)數據量大
(2)寫入操作頻繁
(3)價值較低
對於這樣的數據,我們更適合使用MongoDB來實現數據的存儲
MongoDB安裝與啓動
window系統MongoDB安裝
雙擊"mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi” 按照提示步驟安裝即可。安裝完成後,軟件會安裝在C:\Program Files\MongoDB 目錄中。
我們要啓動的服務程序就是C:\Program Files\MongoDB\Server\3.2\bin目錄下的mongod.exe,爲了方便我們每次啓動,我將C:\Program Files\MongoDB\Server\3.2\bin 設置到環境變量path中。
啓動
(1)首先打開命令提示符,創建一個用於存放數據的目錄
md d:\data
(2)啓動服務
mongod ‐‐dbpath=d:\data(data文件的路徑)
我們在啓動信息中可以看到,mongoDB的默認端口是27017
如果我們想改變默認的啓動端口,可以通過–port來指定端口
在命令提示符輸入以下命令即可完成登陸
mongo
退出mongodb
exit
Docker 環境下MongoDB安裝
在宿主機創建mongo容器
docker run --name mongodb -p 27017:27017 -d mongo
遠程登陸
在bin目錄下打開cmd,輸入命令
mongo 192.168.184.134
MongoDB常用命令
選擇和創建數據庫的語法格式:use 數據庫名稱
如果數據庫不存在則自動創建
以下語句創建student數據庫
use student
插入文檔的語法格式:db.集合名稱.insert(數據)
以下語句插入文檔數據
db.student.insert({"_id":1,"name":"宋政宏","sex":"男","age":25,"introduce":"帥哥"})
查詢集合的語法格式:db.集合名稱.find()
如果我們要查詢student集合的所有文檔,我們輸入以下命令:
db.spit.find()
這裏你會發現每條文檔會有一個叫_id的字段,這個相當於我們原來關係數據庫中表的主鍵,當你在插入文檔記錄時沒有指定該字段,MongoDB會自動創建,其類型是ObjectID類型。如果我們在插入文檔記錄時指定該字段也可以,其類型可以是ObjectID類型,也可以是MongoDB支持的任意類型。
上述操作如圖:
輸入以下測試語句:
db.student.insert({"_id":2,"name":"吳語","sex":"男","age":23,"introduce":"中庸"})
db.student.insert({"_id":3,"name":"華楠","sex":"女","age":21,"introduce":"女神"})
db.student.insert({"_id":4,"name":"山蒲","sex":"男","age":24,"introduce":"小胖"})
db.student.insert({"_id":5,"name":"穆斯","sex":"男","age":26,"introduce":"男神"})
如果我想按一定條件來查詢,比如我想查詢age爲25的記錄,怎麼辦?很簡單!只要在find()中添加參數即可,參數也是json格式,如下:
db.student.find({"age":25})
如果你只需要返回符合條件的第一條數據,我們可以使用findOne命令來實現
db.student.findOne({"age":25})
如果你想返回指定條數的記錄,可以在find方法後調用limit來返回結果,例如:
db.student.find().limit(3)
修改文檔的語法結構:db.集合名稱.update(條件,修改後的數據)
如果我們想修改_id爲1的記錄,年齡爲26,輸入以下語句:
db.student.update({_id:"1"},{"age":NumberInt(26)})
執行後,我們會發現,這條文檔除了age字段其它字段都不見了,爲了解決這個問題,我們需要使用修改器$set來實現,命令如下:
db.student.update({_id:"2"},{$set:{"age":NumberInt(26)}})
刪除文檔的語法結構:db.集合名稱.remove(條件)
以下語句可以將數據全部刪除,請慎用
db.student.remove({})
如果刪除"age"=26的記錄,輸入以下語句
db.student.remove({"age":26})
統計記錄條件使用count()方法。以下語句統計student集合的記錄數
db.student.count()
如果按條件統計 ,例如:統計age爲26的記錄條數
db.student.count({"age":26})
MongoDB的模糊查詢是通過正則表達式的方式實現的。格式爲:/模糊查詢字符串/
例如,我要查詢姓名中帶有"宋"的所有文檔,代碼如下
db.student.find({"name":/政/})
如果要查詢姓名中"宋"開頭的,代碼如下:
db.student.find({"name":/^宋/})
大於 小於 不等於
<, <=, >, >= 這個操作符也是很常用的,格式如下:
db.集合名稱.find({ "field" : { $gt: value }}) // 大於: field > value
db.集合名稱.find({ "field" : { $lt: value }}) // 小於: field < value
db.集合名稱.find({ "field" : { $gte: value }}) // 大於等於: field >= value
db.集合名稱.find({ "field" : { $lte: value }}) // 小於等於: field <= value
db.集合名稱.find({ "field" : { $ne: value }}) // 不等於: field != value
示例:查詢年齡大於25的記錄
db.student.find({"age":{$gt:25}})
包含與不包含
包含使用$in操作符。
示例:查詢age字段包含25,26的文檔
db.student.find({"age":{$in:[25,26]}})
不包含使用$nin操作符。
示例:查詢age字段不包含25,26的文檔
db.student.find({"age":{$nin:[25,26]}})
條件連接
我們如果需要查詢同時滿足兩個以上條件,需要使用 $ and操作符將條件進行關聯。(相當於SQL的and)
格式爲:$and:[ { },{ },{ } ]
示例:查詢age大於23且小於26的文檔
db.student.find({$and:[ {"age":{$gte:23}} ,{"age":{$lt:26} }]})
如果兩個以上條件之間是或者的關係,我們使用or操作符進行關聯,與前面and的使用方式相同
格式爲:$or:[ { },{ },{ } ]
示例:查詢sex爲"男",或者age小於25的文檔記錄
db.student.find({$or:[ {"sex":"男"} ,{"age":{$lt:25} }]})
列值增長
如果我們想實現對某列值在原有值的基礎上進行增加或減少,可以使用$inc運算符來實現
db.student.update({_id:"2"},{$inc:{"age":NumberInt(1)}} )
其實列值增長跟點贊功能更配