若是想了解一下redis的入門教程,能夠去看一下個人上一篇博客html
Mongodb的安裝你們能夠參考一下其餘博主的博客,這裏我就不作介紹了。不過值得注意的是,在Linux版本中若是啓動mongodb的時候出現下面這個錯誤(在windows版本中不會出現下面的問題):java
mongod: /usr/lib/libcurl.so.4: version `CURL_OPENSSL_3' not found (required by mongod)
緣由是由於mongodb啓動須要的是libcurl.so.3
。在咱們安裝好libcurl.so.3
後,咱們可使用下面的命令打開,其中LD_PRELOAD後面跟隨的是庫的位置。(/data/db文件夾須要賦予可讀寫的權限)redis
LD_PRELOAD=/usr/lib/libcurl.so.3 mongod --dbpath /data/dblll
Mongodb是一種非關係性數據庫(nosql),關於nosql的介紹能夠去看一看菜鳥教程sql
MongoDB 是一個基於分佈式文件存儲的數據庫。由 C++ 語言編寫。旨在爲 WEB 應用提供可擴展的高性能數據存儲解決方案。MongoDB 是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。mongodb
下面是Sql與mongodb的術語對比shell
SQL | Mongodb |
---|---|
表(Talbe) | 集合(Collection) |
行(Row) | 文檔(Document) |
列(Col) | 字段(Field) |
主鍵(Primary Key) | 對象ID(ObjectId) |
索引(Index) | 索引(Index) |
嵌套表(Embeded Table) | 嵌入式文檔(Embeded Document) |
數組(Array) | 數組(Array) |
MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。在Mongodb中,對於插入的格式並無要求,字段類型能夠隨意變更。例如,在我建立一個集合後,咱們能夠在這個集合加入下面的數據:數據庫
{
"name":"this is a name",
"age":12
}
一樣咱們也能夠在這個數據庫插入這樣的數據。json
{
"name":8888,
"address":"changsha"
}
當插入這兩個數據後,使用Robo3T數據庫可視化工具顯示以下:windows
經過這個咱們知道,在向mongodb的同一個表中插入數據的時候,插入的數據字段類型能夠不同,即便是相同的字段數據類型也能夠不同。數組
不過即便mongodb能夠這樣作,也可以這樣作,可是卻不是咱們應該這樣作的理由,咱們在設計數據庫的時候,應儘可能提早考慮好數據庫應有的字段,同時每個字段應該使用同一種數據類型,這樣咱們才能牢牢的將程序o把握在咱們的手裏面。
首先咱們先建立一個名字爲test_data_1
的集合。
db.getCollection('test_data_1').insertOne(
{
"name":8888,
"address":"changsha"
}
)
固然,將這一條語句寫成一行也是沒有問題的。其中,Key(也就是上面的name和address)是能夠不帶引號的,同時對於字符串也可使用單引號,不過爲了統一,在後面統一使用雙引號。
下面是執行這一條數據返回的結果
{
"acknowledged" : true,
"insertedId" : ObjectId("5d5f9e5c0336f9e82b3f9d74")
}
其中acknowledged表明數據是否被認可。其中,每一條數據被插入的時候都會返回一個字段「_id」,也就是ObjectId,它是由時間、機器碼、進程pid和自增計數器構成的。「_id」始終遞增,並絕對不重複。
mongodb也同時支持一次插入多個文檔
db.getCollection('test_data_1').insertMany([
{
"name":"名字1",
},
{
"name":"名字2",
},
{
"address":"湖南"
},
]
)
這裏咱們又能夠想想,咱們是否可使用insertOne實現insertMany的功能?確定是能夠的,可是會形成什麼影響呢?咱們能夠從網絡帶寬,磁盤IO,機器性能,以及穩定性來考慮。
在插入相同大小的數據時,使用insertMany的性能要明顯好於insertOne,由於insertOne會頻繁的調用去插入數據,而insertMany卻只會調用一次。若是mangodb數據庫與調用者不在同一臺機器上,那麼性能相差便會更大,由於數據在網絡傳輸的過程當中會添加其餘的報文。那麼插入數據的時候是否是應該將數據所有一次插入呢?也不是!!試想一下,若是插入的數據過多,將磁盤的IO佔滿了,那麼必會對其餘程序形成影響。而且,若是在快要插入完全部數據的時候,服務器斷電了,那麼……因此說,應該合理的選擇一次性插入數據庫的數量。
db.getCollection('test_data_1').find({})
其中{}裏面包含的是查詢條件,由於是查詢全部的數據,因此直接爲空就好了,或者省略{}也行。
db.getCollection('test_data_1').find({"字段1":"固定值1","字段2":"固定值2"})
下面是查詢i範圍值的語法,至於操做符,咱們後面再說。
db.getCollection('test_data_1').find(
{
"字段1":{"操做符1":邊界1,"操做符2":邊界2},
"字段2":{"操做符1":邊界1,"操做符2":邊界2}
}
)
查詢範圍值的數據簡單,舉一個示例:
和前面查詢特定的數據的方法同樣,只不過固定值變成了範圍({"$gt":10}表明大於10)。
下面是範圍操做符及其意義:
操做符 | 意義 |
---|---|
$gt | 大於(great than) |
$gte | 大於等於(great than equal) |
$lt | 小於(less than) |
$lte | 小於等於(less than equal) |
$ne | 不等於(not equal) |
在前面的幾張圖片中,咱們能夠看到,使用find操做的時候,返回了全部的字段,那麼若是咱們並不想要某一些字段的時候,咱們應該怎麼作呢?
db.getCollection('test_data_1').find(用於過濾的條件,用於限定的條件)
下面即是兩個例子:
去除age
只返回age
你們會發現,在後面的用於限定的條件中,若是age爲1,則返回了age和**_id**,若是age爲0,則返回了**_id和name**。在不考慮_id的狀況下,咱們能夠理解:
若是某一個字段被限定爲0,則表明該字段不返回(也就是默認其它字段爲1),因此其餘未被限定的字段則必定會被返回
若是某一個字段被限定爲1,則表明該字段返回(也就是默認其它字段爲0),因此其餘未被限定的字段則不會被返回
_id比較特殊,不管怎樣,都要默認返回,當是若是咱們真的不須要,那麼必須就要把"_id"設置爲0。
獲得數據的條數
db.getCollection('test_data_1').find({}).count()
限定返回結果數量
db.getCollection('test_data_1').find({}).limit(限制返回的數量)
對結果進行排序
db.getCollection('test_data_1').find({}).sort({"字段名":-1或者1})
其中-1爲逆序,1爲正序。
修改數據的前一部分是須要找到數據,而後才能進行修改。一樣,在mongodb中,有兩種方法修改數據(實際上有不少種)
下面介紹updateMany的更新數據
db.getCollection('test_data_1').updateMany(
// 下面是查詢條件
{
"字段名1":"查找條件1","字段名2":"查找條件2"
},
// 進行修改
{
"$set":{"字段名":"新的數據","字段名":"新的數據"}
}
)
其中,若是在進行在進行修改的步驟中,若是字段名之前不存在則會進行增添。
固然,更新數據的內容不可能就這麼一點點,可是由於這僅僅是一個基礎入門教程,其餘的就拜拜吧!想了解更多能夠去看看其餘的教程。
刪除數據也有兩種操做,deleteOne和deleteMany。和修改數據的狀況差很少,一個是刪除第一條知足條件的,一個是刪除全部知足條件的。
仍是以deleteMany來講:
db.getCollection('test_data_1').deleteMany(
// 刪除的條件
{
"字段名1":"值","字段名2":"值2"
}
)
說完簡單的mongodb的操做(增刪改查)咱們如今能夠來講一說稍微複雜一點點的操做了。
在mongodb中進行數據去重是一個很簡單的操做。使用distinct便可。它能夠接收兩個參數,第一個參數爲須要被去重的字段名,第二個參數是進行去重的條件(去重條件也就是進行查詢操做的第一個參數,能夠省略)。
db.getCollection('test_data_1').distinct(去重的字段名,去重的條件)
下面舉個例子:
db.getCollection('test_data_1').distinct("name",{"age":{"$ne":10}})
這個的含義就是,在age不等於10的條件下對name字段進行去重!那麼返回的數據是什麼呢?是一個數組,裏面是去重後的表中name字段的非重複的數據。
注意:這個去重是對返回值去重,而不是對數據庫裏面數據去重,也就是說,執行了這個操做,數據庫沒有發生任何改變。
在這一章只介紹了mongodb的最最基礎的一些東西,原本是想介紹一下Mongodb的其餘操做,可是發現其餘的操做稍微要複雜一點,因此準備在下一章寫。這一章的介紹就介紹到這裏,下一篇博客我將介紹一下Mongodb的其餘操做。
參考書籍:《左手Mongodb,右手Redis》