0.目標
熟悉命令列中對MongoDB的一些基本操作,為接下來Node.js操作MongoDB做準備。
如果你曾經學習或接觸過關係型資料庫(如MySQL、SQLServer等),那麼在閱讀此文時,可自行做以下對應:
Table(表) -> Collection(集合)
Log(記錄) -> Document(文檔)
當然,這種對應並不確切,因為Table(表)的結構是固定的,而Collection(集合)則不然;Log(記錄)的“行”,而Document(文檔)的結構則更多樣化。不過對初學者而言,這樣的比喻可以更快地上手;事實上,文檔型資料庫MongoDB的結構、操作也確實和關係型資料庫(如MySQL)很像。
如果你從未學習過資料庫,那麼建議你先看看開篇文章介紹的書《MongoDB權威指南》,以及本文的參考書籍《NoSQL資料庫技術實戰》,先對非關係型資料庫這個概念有一個理解後,再來看本文。
如果你已經學習過MongoDB等非關係型資料庫,那麼本文權當複習,如有錯誤,歡迎指正。如果你已經是大神,那麼更加歡迎你的指導。
1.串連資料庫
串連資料庫之前,請先確認是否已經開啟MongoDB服務。具體方法請參考上一節說明。
在mongodb所在目錄下開啟命令列,進入mongodb\bin,輸入命令
mongo
| 代碼如下 |
複製代碼 |
|
C:\mongodb\bin>mongo
|
2.切換資料庫
預設shell串連的是原生localhost的test庫,在上面圖片中可以看出,當前正在使用的資料庫(connecting to:)是“test”
如果要切換資料庫,可以輸入下面命令
上面的mydb即要切換的資料庫名稱
3.插入一條記錄
切換到資料庫myfirstdb中
建立對象a,b,並分別儲存
| 代碼如下 |
複製代碼 |
|
// 建立對象a,b
a = {name : "user1"};
b = {name : "user2"};
// 儲存對象a,b
db.user.save(a);
db.user.save(b);
|
用視覺化檢視查看結果
注意到,我們在這之前根本沒有建立過名叫myfirstdb的資料庫,也沒有建立過名叫user的集合,但為什麼命令依然能夠執行、並且得到我們預期的結果?這是因為MongoDB作為
文檔型資料庫,它是無表結構的資料庫,它不需要預先定義表結構。
正是這個特性,MongoDB擁有比關係型資料庫更快的處理速度;另外,它還減少了添加欄位等表結構變更所需要的開銷。這樣,我們就不必再去關心表結構和程式之間的一致性問題;簡單來說,就是你在程式中添加一個欄位時,不必考慮資料庫是否有這個欄位,因為MongoDB會自動為你建立。
4.插入一條複雜一點的記錄
| 代碼如下 |
複製代碼 |
|
c = {name : "user2", card:"KK8566"};
db.user.save(c);
|
在這裡,我們增加了一個欄位”card”,這在之前是不存在的,那麼執行情況如何呢?
先看控制台
再看可視化管理工具
已經自動產生了一個card欄位。
5.修改記錄
上一個例子中,我們看到有兩個”user2”,我們現在要把最後一個改為”user3”
| 代碼如下 |
複製代碼 |
|
db.user.update( {name:"user2", card:"KK8566"}, {$set:{name:"user3", card:"KK8566"} } );
|
修改結果:
6.刪除記錄
我們刪除第一個文檔
| 代碼如下 |
複製代碼 |
|
db.user.remove( {name : "user1" } )
|
7. 查詢記錄
列出所有記錄
| 代碼如下 |
複製代碼 |
|
db.user.find();
|
可以看到,在上一小節我們執行的刪除命令,資料庫裡僅剩兩個文檔。
使用while來輸出
| 代碼如下 |
複製代碼 |
|
var cursor = db.user.find();
while(cursor.hasNext()) printjson( cursor.next());
|
轉為數組
| 代碼如下 |
複製代碼 |
|
var arr = db.user.find().toArray();
arr[1]; // 顯示第1個
|
事實上,我們在Node.js的伺服器端操作MongoDB時,也是使用類似的方式。
8.條件查詢
用MongoDB查詢語句來實現MySQL的條件查詢語句:SELECT * FROM user WHERE NAME=”user3”
| 代碼如下 |
複製代碼 |
|
db.user.find( { name : "user3" } ).forEach( printjson);
|
上面的命令將會返回所有滿足條件的文檔,為了節省開銷,還可以使用findOne()來得到滿足條件的第一個文檔:
| 代碼如下 |
複製代碼 |
|
db.user.findOne( { name : "user3" } );
|
注意,這裡僅僅是一個簡單的條件限制。我們在實際應用中,會有很多很複雜的需求;在MySQL中,我們會使用多個AND或OR來表示與和或的關係。在MongoDB中,也有類似AND或OR的關鍵字,但MongoDB中,一切都是用類似Json的格式來表達的。具體操作我會在後續文章中做詳細介紹,歡迎閱讀。
在查詢語句後面加上limit(num)即可
| 代碼如下 |
複製代碼 |
|
db.user.find().limit(3); // 限制為3個文檔
|
至此,MongoDB基礎的操作就這麼多了,還有一些更進階的操作,將在後續文章中列出