寫在前面
最近讀《node.js學習指南》,對於mongodb沒有介紹太多的工作原理,但是對於一個前端開發者,即使你還沒有用過這種數據庫也可以讓你很好的理解和使用
一本非常好的介紹node.js的書,我一直把他放在觸手可及的地方。 --Mike Amundsen
MongoDB Native Node.js Driver模塊是mongodb自帶的node的驅動,這個驅動發出的mongodb指令和mongodb客戶端發出的指令基本一致。
准備開始- -
1、首先我們應該確保我們的mongodb數據庫本地安裝可以正常運行,如果安裝過程到遇到了問題可以簡單參考我的上一篇博客(window下mongodb的配置與安裝)
2、然后我們需要新建一個項目<nodeLearn> mkdir nodeLearn ,創建一個app.js文件作為項目啟動文件。
3、然后我們需要在項目文件中安裝MongoDB Native Node.js Driver: npm install mongodb
4、開始
1)引入模塊,使用mongodb驅動,創建mongodb.Server對象來建立數據庫的連接:
var mongodb = require('mongodb') var server = new mongodb.Server('localhost',27017,{auto_reconnect:true })
注:Server構造函數的前兩個參數分別是localhost和27017默認端口,第三個參數可選,選項被設置為true,表示如果連接斷開driver會自動進行重連(還有一個參數pollSize,決定並發的TCP連接數量,我還沒有接觸到= =)。
2)使用mongodb.Db對象創建數據庫
var db = new mongodb.Db('mydb',server)
注:第二個參數表示建立已經連接好的Mongodb server
Mongodb Collection
在MongoDB中並沒有表的概念,我們需要一個集合.
1、在數據庫中創建一個collection集合對象
db.createCollection('mycollection',function(err,collection){ })
db.collection('mycollection',function(err,collection){ })
注:使用create和不使用有一些區別,使用create表示立即創建,如果對一個已經存在的collection使用createcollection方法,也可以直接訪問該collection-driver,並不會覆蓋。不使用create並沒有創建實際的collection.
2、在數據庫中徹底銷毀一個collection
db.dropCollection('mycollection',function(err,result){ })
為collection添加數據
在添加數據之前,我們要知道node mongodb driver 與mongodb數據類型存在一種映射關系(但是對於數據轉換背后的處理機制我還不是理解的很清楚,這里為之后的一篇博客做伏筆- -)
添加數據:
1、先用remove方法刪除已有的collection文檔以防止創建失敗,
2、使用insert方法插入數據(接受三個參數,safe模式,keepGoing【插入失敗是否繼續執行】、serializeFunctions【是否序列化】)
到這里我們已經可以連接到我們的mongodb數據庫,並添加文檔了,這對於一個大二的前端開發小伙伴來說是興奮地,以至於半夜不睡覺發神經擾民- -
1 var mongodb = require('mongodb'); 2 3 var server = new mongodb.Server('localhost', 27017, {auto_reconnect: true}); 4 var db = new mongodb.Db('exampleDb', server); 5 6 db.open(function (err, db) { 7 if (!err) { 8 db.collection('widgets', function (err, collection) { 9 //刪除exampleDb數據庫widgets集合中的數據 10 collection.remove(null, {safe: true}, function (err, result) { 11 if (!err) { 12 console.log('result of remove' + result); 13 //創建兩條數據 14 var widget1 = {id: 1, title: 'First Great widget', desc: 'greatest widget of all', price: 14.99}; 15 var widget2 = { 16 id: 2, 17 title: 'Second Great widget', 18 desc: 'second greatest widget of all', 19 price: 29.99 20 }; 21 collection.insert(widget1); 22 collection.insert(widget2, {safe: true}, function (err, result) { 23 if (err) { 24 console.log(err) 25 } else { 26 collection.find().toArray(function (err, docs) { 27 console.log(docs); 28 //關閉數據庫 29 db.close(); 30 }); 31 } 32 }) 33 } 34 }) 35 }) 36 } 37 });
進入到項目文件,我們通過node命令啟動app服務: node app ,
當然你如果你想避免每次修改之后通過node命令重啟服務的繁瑣,可以使用supervisor,通過 npm install supervisor -g 安裝在全局中,使用supervisor命令代替node,這樣修改文件之后,不需要每次通過node命令重啟服務
那么我們在命令行看下結果吧- -
然后我們在mongodb數據庫中看下數據結果:(如果你已經配置好了mongo的環境變量,以管理員身份打開cmd,通過mongo命令啟動mongodb)
會看到數據庫widgets文檔中也加入了我們想要的兩條數據,
如果批量處理文檔數據,我們需要盡可能的設置keepGoing為true。
實現查詢數據
對於MongoDB Native Node.js Driver來說有四種查詢數據的方法:find()、findOne()、findAndRemove()、findAndModify()
findOne()和find()支持以下三個參數:查詢數據、可選參數、回調函數 。(對於可選參數和回調函數都是可選項、而且這兩種選項的可選值非常多,但是大部分查詢只會用到一小部分的選項值)
常用的 sort(文檔排序,-1倒排序,1正排序)、
Field(查詢語句並返回field)、
Skip(skip n個文檔,用於跳頁)
Hint(告訴數據庫使用特定的索引)
returnKey(只返回索引的key)
Comment(為查詢在log日志文件中添加描述)
showDiscLoc(顯示結果在磁盤中的位置)...
這些選項值我們同樣可以在mongo下使用,進行數據的一些操作
1、接下來我們來用find()查詢並返回我們數據庫的內容,可以直接使用toArray()方法將結果轉化為數組
2、使用可選值field來進行篩選,{fields:{ type=0 }} 設置為0來查詢除type之外的字段,為1相反
collection.find({type="A"},{fields:{type=0}}).toArray(function(err,docs){ if(err){ console.log(err) }else{ console.log(docs); //關閉數據庫鏈接 db.close(); } })
我們來找到所有type為A,並且返回這條數據(不含type字段)。但是需要注意的一點是,我們設置為1,也並不是只出現type字段,系統生成的唯一標識符也就是_id總是會出現在查詢結果中
更新、刪除文檔
修改、刪除文檔的方法:更新文檔:update() 或者是upserts(如果不存在就添加文檔),刪除文檔remove()、查找並修改或者刪除一個文檔findAndModify()、查找並刪除一個文檔findAndRemove()
update/remove和后兩個方法之間最本質的區別就在於后者兩個方法都返回了被操作的文檔
使用$set修改符代替field,$set修改符使只會修改作為屬性傳遞給修改器的field
1 var mongodb = require('mongodb'); 2 3 var server = new mongodb.Server('localhost', 27017, {auto_reconnect: true}); 4 var db = new mongodb.Db('exampleDb', server); 5 6 db.open(function (err, db) { 7 if (!err) { 8 db.collection('widgets', function (err, collection) { 9 //更新數據 10 collection.update({id: 2}, {$set: {title: "Super Bad Widget"}}, {safe: true}, function (err, result) { 11 if (err) { 12 console.log(err) 13 } else { 14 console.log(result); 15 //查詢更新數據庫 16 collection.findOne({id: 2}, function (err, doc) { 17 if (!err) { 18 console.log(doc); 19 //關閉數據庫 20 db.close(); 21 } 22 }) 23 } 24 }) 25 }) 26 } 27 });
更新后的數據庫已經改變
寫在后面
使用MongoDB Native Node.js Driver模塊,驅動的指令基本上和mongodb客戶端是一致的,如果你跟我一樣對原始的驅動模塊感興趣,那么這個nodeJS Driver官網一定可以幫到你。
雖然原始驅動提供了數據庫的連接,但是缺少更高級別的抽象,有些繁瑣,所以有時候你需要使用類似mongoose的ODM,
mongoose構建在mongodb之上,提供了Schema、Model和Document對象,用起來更為方便。
下一次我會總結一下使用express + mongoose建立數據庫的連接