1. 程式人生 > >讓NodeJS更容易操作Mongodb資料庫

讓NodeJS更容易操作Mongodb資料庫

Mongoose是什麼

Mongoose是MongoDB的一個物件模型工具,可以工作於非同步環境下 。

定義一個模型很容易:

varComments=newSchema({
    title     :String, body      :String, date      :Date});varBlogPost=newSchema({
    author    :ObjectId, title     :String, body      :String, date      :Date, comments  :[Comments], meta      :{
        votes 
:Number, favs :Number}}); mongoose.model('BlogPost',BlogPost);

安裝

推薦通過NPM方式安裝:

$ npm install mongoose

或者,你可以從Github倉庫中獲取程式碼,然後解壓:

$ git clone [email protected].com:LearnBoost/mongoose.git support/mongoose/
// 將模組新增至NodeJS可以找到的環境路徑中require.paths.unshift('support/mongoose/lib');

然後就可以在應用中將mongoose模組包含進來

require('mongoose');

連線到MongoDB資料庫

首先,我們需要定義一個連線。如果你的應用只使用一個數據庫,可以使用mongoose.connect,如果需要建立附加資料庫連線,使用mongoose.createConnection。

connect和createConnection都能連線mongodb資料庫,支援以URI或引數(host,database,port)的形式。

var mongoose =require('mongoose');
mongoose.connect('mongodb://www.csser.com/csser.com_database');

連線一旦建立成功,該連線例項的open事件就被觸發。如果你使用的是mongoose.connect方式,連線物件為mongoose.connection;否則,mongoose.createConnection返回的是Connection物件。

切記!Mongoose在與資料庫真正建立連線之前便快取了所有的命令,這就意味著你在定義模型、執行查詢時不必非要確認與MongoDB資料庫的連線是否已經建立。(一回@CSSer注:非同步是MongoDB等與傳統資料庫的重大區別)

定義模型

模型是通過模式介面(Schema interface)定義的,如:

varSchema= mongoose.Schema,ObjectId=Schema.ObjectId;varBlogPost=newSchema({
    author    :ObjectId, title     :String, body      :String, date      :Date});

除了定義文件結構和你要儲存的資料型別外,模式(Schema)還用於以下定義:

  • Validators (非同步和同步)
  • Defaults - 預設值
  • Getters
  • Setters
  • Indexes - 索引
  • Middleware - 中介軟體
  • Methods definition - 方法定義
  • Statics definition - 靜態定義
  • Plugins - 外掛

下面的程式碼向我們展示了這些功能的一部分:

varComment=newSchema({
    name  :{ type:String,default:'hahaha'}, age   :{ type:Number, min:18, index:true}, bio   :{ type:String, match:/[a-z]/}, date  :{ type:Date,default:Date.now }});// 定義setterComment.path('name').set(function(v){return v.capitalize();});// 定義中介軟體Comment.pre('save',function(next){
    notify(this.get('email'));next();});

你可以檢視幾乎包含所有模型定義的 示例 。

訪問模型

當通過mongoose.model('ModelName', mySchema)定義了一個模型之後,我們可以通過相同的函式來訪問它:

var myModel = mongoose.model('ModelName');

接下來我們可以將模型的例項儲存下來:

var instance =new myModel();
instance.my.key ='csser';
instance.save(function(err){//});

或者我們也可以從同樣的的集合(collection)中找到文件(documents):

myModel.find({},function(err, docs){// docs.forEach});

也可以呼叫findOne, findById, update等等方法,更多的細節請閱讀 API文件 。

嵌入文件

還記得在第一個示例的程式碼片段中,我們在模式中定義了一個鍵(key):

comments:[Comments]

這裡的Comments是我們已經建立的模式(Schema),這就是說建立嵌入文件跟下面的程式碼看起來一樣簡單:

// 重新獲得模型varBlogPost= mongoose.model('BlogPost');// 建立一篇部落格日誌var post =newBlogPost();// 建立一個評論
post.comments.push({ title:'My comment for csser.com'});

post.save(function(err){if(!err) console.log('Success!');});

用同樣的方式刪除模式:

BlogPost.findById(myId,function(err, post){if(!err){
    post.comments[0].remove();
    post.save(function(err){// do something});}});

嵌入文件擁有與模型相同的功能,包括Defaults、validators、middleware等。當發生錯誤時,它會冒泡到save()錯誤回撥函式,這裡錯誤處理是一個單元。

Mongoose interacts with your embedded documents in arrays atomically, out of the box.

中介軟體

中介軟體是Mongoose 1.0推出的最激動人心的功能之一,它讓我們可以不用再受巢狀回撥函式的折磨了。

中介軟體定義在模式級別(Schema level),當方法初始化時(文件與MongoDB資料初始化後)、儲存資料時(文件或嵌入文件儲存後)生效。

中介軟體有兩種型別,它們由定義的函式簽名確定(即函式接受的引數)。

順序(Serial)中介軟體定義如下:

.pre(method,function(next){// ...})

當每個中介軟體呼叫下一個時,它們按順序執行。

並行(Parallel)中介軟體提供更細粒度的控制,其定義如下:

.pre(method,function(next,done){// ...})

Parallel 中介軟體可以立刻next(),但是隻有當所有parallel中介軟體呼叫done()之後最後的引數才被執行。

錯誤處理

如果任一個中介軟體呼叫next或done時丟擲了錯誤,執行流會中斷,錯誤會被作為引數傳入回撥函式。

例如:

schema.pre('save',function(next){// 發生了一些錯誤next(newError('有錯誤發生'));});// 接著...

myModel.save(function(err){// 錯誤可以來自某個中介軟體});

API 文件

可以在 http://mongoosejs.com 找到相關API文件。