Mongodb最基礎入門教程 如果想瞭解一下redis的入門教程,可以去看一下我的上一篇博客 Mongodb的安裝大家可以參考一下其他博主的博客,這裡我就不做介紹了。不過值得註意的是,在Linux版本中如果啟動mongodb的時候出現下麵這個錯誤(在windows版本中不會出現下麵的問題): mon ...
Mongodb最基礎入門教程
如果想瞭解一下redis的入門教程,可以去看一下我的上一篇博客
Mongodb的安裝大家可以參考一下其他博主的博客,這裡我就不做介紹了。不過值得註意的是,在Linux版本中如果啟動mongodb的時候出現下麵這個錯誤(在windows版本中不會出現下麵的問題):
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文件夾需要賦予可讀寫的許可權)
LD_PRELOAD=/usr/lib/libcurl.so.3 mongod --dbpath /data/dblll
簡介
Mongodb是一種非關係性資料庫(nosql),關於nosql的介紹可以去看一看菜鳥教程
MongoDB 是一個基於分散式文件存儲的資料庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。MongoDB 是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。
下麵是Sql與mongodb的術語對比
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
}
同樣我們也可以在這個資料庫插入這樣的數據。
{
"name":8888,
"address":"changsha"
}
當插入這兩個數據後,使用Robo3T資料庫可視化工具顯示如下:
通過這個我們知道,在向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中,有兩種方法修改數據(實際上有很多種)
- updateOne:只更新第一條符合條件的數據
- updateMany:更新所有符合條件的數據
下麵介紹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》