Mongoose是什麼

Mongoose是MongoDB的一個對象模型工具,能夠工做於異步環境下。css

定義一個模型很容易:git

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

安裝

推薦經過NPM方式安裝:github

$ npm install mongoose

或者,你能夠從Github倉庫中獲取代碼,而後解壓:mongodb

$ git clone git@github.com:LearnBoost/mongoose.git support/mongoose/
// 將模塊添加至NodeJS能夠找到的環境路徑中require.paths.unshift('support/mongoose/lib');

而後就能夠在應用中將mongoose模塊包含進來數據庫

require('mongoose');

鏈接到MongoDB數據庫

首先,咱們須要定義一個鏈接。若是你的應用只使用一個數據庫,可使用mongoose.connect,若是須要建立附加數據庫鏈接,使用mongoose.createConnection。npm

connect和createConnection都能鏈接mongodb數據庫,支持以URI或參數(host,database,port)的形式。api

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)定義的,如:mongoose

var Schema = mongoose.Schema  , ObjectId = Schema.ObjectId;var BlogPost = new Schema({    author    : ObjectId  , title     : String  , body      : String  , date      : Date});

除了定義文檔結構和你要存儲的數據類型外,模式(Schema)還用於如下定義:

  • Validators (異步和同步)
  • Defaults - 默認值
  • Getters
  • Setters
  • Indexes - 索引
  • Middleware - 中間件
  • Methods definition - 方法定義
  • Statics definition - 靜態定義
  • Plugins - 插件

下面的代碼向咱們展現了這些功能的一部分:

var Comment = new Schema({    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),這就是說建立嵌入文檔跟下面的代碼看起來同樣簡單:

// 從新得到模型var BlogPost = mongoose.model('BlogPost');// 建立一篇博客日誌var post = new BlogPost();// 建立一個評論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(new Error('有錯誤發生'));});// 接着...myModel.save(function (err) {  // 錯誤能夠來自某個中間件});

API 文檔

能夠在 http://mongoosejs.com 找到相關API文檔。