標籤:顯示 傳遞 pre one localhost test modify 基本 準備
寫在前面
最近讀《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.9920 };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建立資料庫的串連
MongoDB Native Node.js Driver