Mongoose是什么
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 git@github.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文檔。
轉自:http://www.csser.com/board/4f3f516e38a5ebc9780004fe
http://www.csser.com/board/4f4e92dbeb0defac5700011e