熟悉命令行中對MongoDB的一些基本操作,為接下來Node.js操作MongoDB做準備。
如果你曾經(jīng)學習或接觸過關系型數(shù)據(jù)庫(如MySQL、SQLServer等),那么在閱讀此文時,可自行做以下對應:
Table(表) -> Collection(集合)
Log(記錄) -> Document(文檔)
當然,這種對應并不確切,因為Table(表)的結構是固定的,而Collection(集合)則不然;Log(記錄)的“行”,而Document(文檔)的結構則更多樣化。不過對初學者而言,這樣的比喻可以更快地上手;事實上,文檔型數(shù)據(jù)庫MongoDB的結構、操作也確實和關系型數(shù)據(jù)庫(如MySQL)很像。
如果你從未學習過數(shù)據(jù)庫,那么建議你先對非關系型數(shù)據(jù)庫這個概念有一個理解后,再來看本文。廢話不多說,我們馬上來學習MongoDB
連接數(shù)據(jù)庫之前,請先確認是否已經(jīng)開啟MongoDB服務。具體方法請參考上一節(jié)說明。
在mongodb所在目錄下打開命令行,進入mongodb\\bin,輸入命令 mongo
C:\\mongodb\\bin>mongo
進入MongoDB
默認shell連接的是本機的localhost的test庫,在上面圖片中可以看出,當前正在使用的數(shù)據(jù)庫(connecting to:)是“test”
如果要切換數(shù)據(jù)庫,可以輸入下面命令
use mydb
上面的mydb即要切換的數(shù)據(jù)庫名稱
切換到數(shù)據(jù)庫myfirstdb中
use myfirstdb
切換數(shù)據(jù)庫
創(chuàng)建對象a,b,并分別保存
// 創(chuàng)建對象a,b
a = {name : "user1"};
b = {name : "user2"};
// 保存對象a,b
db.user.save(a);
db.user.save(b);
執(zhí)行結果
用可視化工具查看結果
MongoCola查看結果
注意到,我們在這之前根本沒有創(chuàng)建過名叫myfirstdb的數(shù)據(jù)庫,也沒有創(chuàng)建過名叫user的集合,但為什么命令依然能夠執(zhí)行、并且得到我們預期的結果?這是因為MongoDB作為文檔型數(shù)據(jù)庫,它是無表結構的數(shù)據(jù)庫,它不需要預先定義表結構。
正是這個特性,MongoDB擁有比關系型數(shù)據(jù)庫更快的處理速度;另外,它還減少了添加字段等表結構變更所需要的開銷。這樣,我們就不必再去關心表結構和程序之間的一致性問題;簡單來說,就是你在程序中添加一個字段時,不必考慮數(shù)據(jù)庫是否有這個字段,因為MongoDB會自動為你創(chuàng)建。
c = {name : "user2", card:"KK8566"};
db.user.save(c);
在這里,我們增加了一個字段”card”,這在之前是不存在的,那么執(zhí)行情況如何呢?
先看控制臺
再看可視化管理工具
MongoCola查看結果
已經(jīng)自動生成了一個card字段。
上一個例子中,我們看到有兩個”user2”,我們現(xiàn)在要把最后一個改為”user3”
db.user.update( {name:"user2", card:"KK8566"}, {$set:{name:"user3", card:"KK8566"} } );
修改結果:
修改結果
MongoCola查看結果
我們刪除第一個文檔
db.user.remove( {name : "user1" } )
刪除
MongoCola查看結果
列出所有記錄
db.user.find();
可以看到,在上一小節(jié)我們執(zhí)行的刪除命令,數(shù)據(jù)庫里僅剩兩個文檔。
使用while來輸出
var cursor = db.user.find();
while(cursor.hasNext()) printjson( cursor.next());
通過while來批量輸出
轉為數(shù)組
var arr = db.user.find().toArray();
arr[1]; // 顯示第1個
數(shù)組
事實上,我們在Node.js的服務器端操作MongoDB時,也是使用類似的方式。
用MongoDB查詢語句來實現(xiàn)MySQL的條件查詢語句:SELECT * FROM user WHERE NAME=”user3”
db.user.find( { name : "user3" } ).forEach( printjson);
條件查詢
上面的命令將會返回所有滿足條件的文檔,為了節(jié)省開銷,還可以使用findOne()來得到滿足條件的第一個文檔:
db.user.findOne( { name : "user3" } );
注意,這里僅僅是一個簡單的條件限制。我們在實際應用中,會有很多很復雜的需求;在MySQL中,我們會使用多個AND或OR來表示與和或的關系。在MongoDB中,也有類似AND或OR的關鍵字,但MongoDB中,一切都是用類似Json的格式來表達的。具體操作我會在后續(xù)文章中做詳細介紹,歡迎閱讀。
9.限制結果集數(shù)量
在查詢語句后面加上limit(num)即可
db.user.find().limit(3); // 限制為3個文檔
至此,MongoDB基礎的操作就這么多了,還有一些更高級的操作,將在后續(xù)文章中列出
原文來自:簡書/Mike的讀書季