為了保存網站的使用者資料和業務數據,通常需要一個資料庫。 MongoDB和Node.js特別般配,因為MongoDB是基於文件的非關係型資料庫,文件是按BSON(JSON的輕量化二進位格式)儲存的,增刪改查等管理資料庫的指令和JavaScript語法很像。如果你在Node.js裡存取MongoDB的數據,會有我們是一家人的感覺,特別親切。
我也準備好使用MongoDB來作為我的資料庫。
MongoDB使用集合(collection)和文件(document)來描述和儲存數據,collection相當於表,document相當於行,不過MySQL之類的關係型資料庫,表結構是固定的,例如某一行由若干列組成,行行都一樣,而MongoDB不同,一個集合裡的多個文件可以有不同的結構,更靈活一些。
安裝Mongo
詳細指南在這裡(MongoDB的官方文件):https://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/。
到https://www.mongodb.org/downloads下載安裝包,Windows系統是msi文件,我選擇的是「Windows 64-bit 2008 R2+」這個版本。
安裝非常簡單,你可以默認,也可以選擇安裝位置,我裝到了G碟MongoDB目錄下。安裝完後,目錄結構是這樣的:G:MongoDBServer3.0。
mongod、mongo以及其它的工具,都在3.0目錄下的bin目錄。
啟動
要使用MongoDB,需要指定一個資料夾讓它存放數據,我在G:MongoDB下建立了一個名為db的資料夾。
開啟cmd,進入G:MongoDBServer3.0bin目錄,執行“mongod –dbpath=G:MongoDBdb”,就會啟動MongoDB,看到下面的圖:
MongoDB啟動後,會監聽在一個連接埠上等待客戶端來連接,從上圖可以看出,預設監聽的連接埠是27017。你可以「–port」選項改變這個端口,例如「mongod –port 28018 –dbpath=G:MongoDBdb」指令就會啟動MongoDB並監聽28018埠。
啟動了MongoDB,我們就可以使用mongo(互動式shell)來管理資料庫了。直接在bin目錄下執行mongo,就可以看到下圖:
mongo Shell預設連接到了test資料庫,也告訴我們可以輸入help來查看幫助。你可以鍵入help並回車,看看都有哪些指令可用。
注意,mongod預設啟動時不帶鑑權,客戶端連上後就可以隨便操作,建庫、增刪改查等統統可以。你要限制使用者權限,可以自己設定下,我這裡就直接往下走了。
安裝mongoose驅動
安裝GIT工具:
由於github網站不支援直接下載打包了所有submodule的源碼包,所以需要透過git工具來簽出所有的原始碼。從http://code.google.com/p/msysgit/downloads/list,可以下載到msysgit這個Windows平台下的git客戶端工具(最新版本檔案為Git-1.7.7.1-preview20111027.exe)。下載之後雙擊安裝。
下載NPM原始碼:
開啟命令列工具(CMD),執行以下命令,可以透過msysgit簽出NPM的所有原始碼和依賴程式碼並安裝npm。
git clone --recursive git://github.com/isaacs/npm.git cd npm node cli.js install npm -gf
在執行這段程式碼之前,請確保node.exe是跟著透過node.msi的方式安裝的,或是在PATH環境變數中。這段指令也會將npm加入PATH環境變數去,之後可以隨處執行npm指令。如果安裝中遇到權限方面的錯誤,請確保cmd命令列工具是透過管理員身分執行的。安裝成功後,執行以下指令:
npm install underscore
回傳:
underscore@1.2.2 ./node_modules/underscore
如此,Windows平台下的NPM安裝完畢,然後我們可以安裝mongoose
npm install mongoose
實例
一些基礎的操作,說明都寫在程式碼註解裡了:
// mongoose 链接 var mongoose = require('mongoose'); var db = mongoose.createConnection('mongodb://127.0.0.1:27017/NodeJS'); // 链接错误 db.on('error', function(error) { console.log(error); }); // Schema 结构 var mongooseSchema = new mongoose.Schema({ username : {type : String, default : '匿名用户'}, title : {type : String}, content : {type : String}, time : {type : Date, default: Date.now}, age : {type : Number} }); // 添加 mongoose 实例方法 mongooseSchema.methods.findbyusername = function(username, callback) { return this.model('mongoose').find({username: username}, callback); } // 添加 mongoose 静态方法,静态方法在Model层就能使用 mongooseSchema.statics.findbytitle = function(title, callback) { return this.model('mongoose').find({title: title}, callback); } // model var mongooseModel = db.model('mongoose', mongooseSchema); // 增加记录 基于 entity 操作 var doc = {username : 'emtity_demo_username', title : 'emtity_demo_title', content : 'emtity_demo_content'}; var mongooseEntity = new mongooseModel(doc); mongooseEntity.save(function(error) { if(error) { console.log(error); } else { console.log('saved OK!'); } // 关闭数据库链接 db.close(); }); // 增加记录 基于model操作 var doc = {username : 'model_demo_username', title : 'model_demo_title', content : 'model_demo_content'}; mongooseModel.create(doc, function(error){ if(error) { console.log(error); } else { console.log('save ok'); } // 关闭数据库链接 db.close(); }); // 修改记录 mongooseModel.update(conditions, update, options, callback); var conditions = {username : 'model_demo_username'}; var update = {$set : {age : 27, title : 'model_demo_title_update'}}; var options = {upsert : true}; mongooseModel.update(conditions, update, options, function(error){ if(error) { console.log(error); } else { console.log('update ok!'); } //关闭数据库链接 db.close(); }); // 查询 // 基于实例方法的查询 var mongooseEntity = new mongooseModel({}); mongooseEntity.findbyusername('model_demo_username', function(error, result){ if(error) { console.log(error); } else { console.log(result); } //关闭数据库链接 db.close(); }); // 基于静态方法的查询 mongooseModel.findbytitle('emtity_demo_title', function(error, result){ if(error) { console.log(error); } else { console.log(result); } //关闭数据库链接 db.close(); }); // mongoose find var criteria = {title : 'emtity_demo_title'}; // 查询条件 var fields = {title : 1, content : 1, time : 1}; // 待返回的字段 var options = {}; mongooseModel.find(criteria, fields, options, function(error, result){ if(error) { console.log(error); } else { console.log(result); } //关闭数据库链接 db.close(); }); // 删除记录 var conditions = {username: 'emtity_demo_username'}; mongooseModel.remove(conditions, function(error){ if(error) { console.log(error); } else { console.log('delete ok!'); } //关闭数据库链接 db.close(); });