名词解释
Schema:模型骨架,以文档的形式存储,不具备数据库的操作能力
Model:是Schema生成的模型,能够操作数据库
Entity:Model创建的实体,操作会影响数据库
三者之间的关系:Schema生成Model,Model创造Entity,Model和Entity都能够对数据库造成影响,但是Model比Entity更加具有操作性
准备工作
连接数据库
数据库连接
定义Schema
属性name,类型为String
})
将Schema发布成Model
代码将会发生异常
使用Model创建Entity
在骨架Schema上创建方法
Entity具有操作数据的CRUD
使用Model查询数据
查询到所有的person
});
新手指引
定义Schema
属性,后者为属性类型
Schema数据类型
关于ObjectId 主键,每个Schema都会有一个主键,默认为
_id:ObjectId
,可以使用new mongoose.Schema({id:Types.ObjectId});
Schema扩展
methods 直接通过PersonSchema调用?
调用
})
PersonSchema.virtual('name.full').set(function(name){
var split = name.split(' ');
this.name.first = split[0];
this.name.last = split[1];
});
var PersonModel = mongoose.model('Person',PersonSchema);
var krouky = new PersonModel({});
krouky.name.full = 'krouky han';//会被<a href="/tag/zidong/" target="_blank" class="keywords">自动</a>分解
console.log(krouky.name.first);//krouky</code></pre>
配置项
new mongoose.Schema(config,options);
第二个参数就是配置项或者使用var mySchema = new mongoose.Schema(config); mySchema.set(option,value)
,配置项包括safe,strict,capped,versionKey,autoIndex
1.safe安全属性,两种方式
2.strict严格配置(默认启用),确保Entity的值在进入数据库之前会被自动验证,strict可以设置为throw,遇到错误抛出
属性将无法被存储
//该<a href="/tag/shuxing/" target="_blank" class="keywords">属性</a>也能在构造实例的时使用
var ThingModel = db.model('Thing');
var thing1 = new ThingModel(doc,true); //启用严格
var thing2 = new ThingModel(doc,false); //禁用严格</code></pre>
3.shardKey 做分布式使用
4.capped 上限设置
5.versionKey版本锁
数据库的版本锁就不是__v属性,而是__someElse,相当于是给版本锁取名字。
new Schema({...},{versionKey:false});//删除
6.autoIndex自动索引
文档操作
更新
1.方式一:通过Entity更新
2.通过Model更新
删除
PersonModel.updaete({_id:_id},person,function(err){})
})
3.使用$set属性
修改的数量
Person.findByIdAndUpdate({_id:_id},callback);//回调的第二个参数为修改的实体entity
//findByIdAndRemove方法类似
新增
区别:如果使用Model新增,传入对象必须是纯净的JSON对象,不能是Model创建的实体.使用Model创建的实体pen,虽然打印出来是只有{name:'pen'},但是pen属于Entity,包含了Schema属性和Model数据库行为模型。如果将Model创建的对象传入时,一定会将隐藏的属性也传入数据库。
删除
对比新增,分别有Entity和Model的remove方式
子文档(SubDocs)
//使用
var ParentModel = db.model('Parent',parentSchema);
var parent = new ParentModel({
children2:[{name:'c1'},{name:'c2'}]
})
parent.children2[0].name = 'd';
parent.save(callback);
//parent在执行保存时,先保存children2[0].name,children2[1].name,然后再保存</code></pre>
查询子文档
验证@H_301_233@
1.验证始终定义在SchemaTypes中
2.验证是一个内部中间件
3.验证实在一个Document被默认启用的,除非你关闭
4.验证是异步递归的,如果SubDoc验证失败,Document也将无法保存
5.验证并不关心错误的类型,而通过ValidationError对象访问
验证器
1.required
2.max/min
3.enum/match(枚举验证/匹配验证)
4.validate自定义验证规则
required:true //姓名非空
},age:{
type:'Nunmer',min:18,//年龄最小18
max:120 //年龄最大120
},city:{
type:'String',enum:['北京','上海'] //只能是北京、上海人
},other:{
type:'String',validate:[validator,err] //validator是一个验证函数,err是验证失败的错误信息
}
});
验证失败之后,返回的错误信息
错误集合(对象)
err.errors.color //错误属性(Schema的color属性)
err.errors.color.message //错误属性信息
err.errors.path //错误属性路径
err.errors.type //错误类型
err.name //错误名称
err.message //错误消息