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方式安装:
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();});
你可以查看几乎包含所有模型定义的 示例 。
// 重新获得模型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.