关于NodeJs为什么要用nodejs连接mongoosee操作mongodb

Mongoose,nodejs和mongodb的连接器。
今天我们将学习Mongoose,什么是Mongoose呢,它于MongoDB又是什么关系呢,它可以用来做什么呢,介绍Mongoose之前,我们先简单了解一下MongoDB。
MongoDB是一个开源的NoSQL数据库,相比MySQL那样的关系型数据库,它更显得轻巧、灵活,非常适合在数据规模很大、事务性不强的场合下使用。同时它也是一个对象数据库,没有表、行等概念,也没有固定的模式和结构,所有的数据以文档的形式存储(文档,就是一个关联数组式的对象,它的内部由属性组成,一个属性对应的值可能是一个数、字符串、日期、数组,甚至是一个嵌套的文档。),数据格式就是JSON。
介绍了MongoDB,我们下面就要认识Mongoose了。
1. Mongoose是什么?
Mongoose是MongoDB的一个对象模型工具,是基于node-mongodb-native开发的MongoDB nodejs驱动,可以在异步的环境下执行。同时它也是针对MongoDB操作的一个对象模型库,封装了MongoDB对文档的的一些增删改查等常用方法,让NodeJS操作Mongodb数据库变得更加灵活简单。
2. Mongoose能做什么?
Mongoose,因为封装了对MongoDB对文档操作的常用处理方法,让NodeJS操作Mongodb数据库变得easy、easy、So easy!
学习了上面的介绍,相信你已经对Mongoose有了初步的认识和了解,千里之行,始于足下,奔跑吧,少年!
前面我们已经认识了Mongoose,也了解了MongoDB,回顾一下:MongoDB是一个对象数据库,是用来存储数据的;Mongoose是封装了MongoDB操作的一个对象模型库,是用来操作这些数据的。
好,下面我们就来进行操作数据的第一步吧。
1. 安装mongoose:
&npm&install&mongoose
2. 引用mongoose:
&var&mongoose&=&require("mongoose");
3. 使用"mongoose"连接数据库:
&var&db&=&mongoose.connect("mongodb://user:pass@localhost:port/database");
4. 执行下面代码检查默认数据库test,是否可以正常连接成功?
&var&mongoose&=&require("mongoose");&&
&var&db&=&mongoose.connect("mongodb://127.0.0.1:27017/test");&
&db.connection.on("error",&function&(error)&{&&console.log("数据库连接失败:"&+&error);&});&
&db.connection.on("open",&function&()&{&&console.log("------数据库连接成功!------");&});
通过上节内容的学习我们已经打下了基础,本节内容就开始对MongoDB数据库进行具体操作。首先,我们再次简单介绍一下MongoDB数据库。
MongoDB —— 是一个对象数据库,没有表、行等概念,也没有固定的模式和结构,所有的数据以Document(以下简称文档)的形式存储(Document,就是一个关联数组式的对象,它的内部由属性组成,一个属性对应的值可能是一个数、字符串、日期、数组,甚至是一个嵌套的文档。),后面我们会学习如何创建文档并插入内容。
在MongoDB中,多个Document可以组成Collection(以下简称集合),多个集合又可以组成数据库。
我们想要操作MongoDB数据,那就得先要具备上面所说的包含数据的“文档”,文档又是什么意思呢,请看如下介绍。
文档 —— 是MongoDB的核心概念,是键值对的一个有序集,在JavaScript里文档被表示成对象。同时它也是MongoDB中数据的基本单元,非常类似于关系型数据库管理系统中的行,但更具表现力。
集合 —— 由一组文档组成,如果将MongoDB中的一个文档比喻成关系型数据库中的一行,那么一个集合就相当于一张表。
如果我们要通过Mongoose去创建一个“集合”并对其进行增删改查,该怎么实现呢,到这里我们就要先了解Schema(数据属性模型)、Model、Entity了。
好,下面就开始去深入了解它们吧!
Schema简述
Schema —— 一种以文件形式存储的数据库模型骨架,无法直接通往数据库端,也就是说它不具备对数据库的操作能力,仅仅只是数据库模型在程序片段中的一种表现,可以说是数据属性模型(传统意义的表结构),又或着是“集合”的模型骨架。
那如何去定义一个Schema呢,请看示例:
var&mongoose&=&require("mongoose");
var&TestSchema&=&new&mongoose.Schema({
&name&:&{&type:String&},//属性name,类型为String
&age&:&{&type:Number,&default:0&},//属性age,类型为Number,默认为0
&time&:&{&type:Date,&default:Date.now&},
&email:&{&type:String,default:''}
基本属性类型有:字符串、日期型、数值型、布尔型(Boolean)、null、数组、内嵌文档等。
Model —— 由Schema构造生成的模型,除了Schema定义的数据库骨架以外,还具有数据库操作的行为,类似于管理数据库属性、行为的类。
如何通过Schema来创建Model呢,如下示例:
var&db&=&mongoose.connect("mongodb://127.0.0.1:27017/test");&&
//&创建Model&var&TestModel&=&db.model("test1",&TestSchema);
test1:数据库中的集合名称,当我们对其添加数据时如果test1已经存在,则会保存到其目录下,如果未存在,则会创建test1集合,然后在保存数据。
拥有了Model,我们也就拥有了操作数据库的金钥匙,在后面的内容中,我们就会学习使用Model来进行增删改查的具体操作,所以,一定要熟悉他的创建格式哟!
如果你想对某个集合有所作为,那就交给Model模型来处理吧,创建一个Model模型,我们需要指定:1.集合名称,2.集合的Schema结构对象,满足这两个条件,我们就会拥有一个操作数据库的金钥匙。
Entity简述
Entity —— 由Model创建的实体,使用save方法保存数据,Model和Entity都有能影响数据库的操作,但Model比Entity更具操作性。
使用Model创建Entity,如下示例:
&var&TestEntity&=&new&TestModel({&&&
&name&:&"Lenka",&&age&:&36,&&email:&""&});&
&console.log(TestEntity.name);&//&Lenka&
&console.log(TestEntity.age);&//&36
创建成功之后,Schema属性就变成了Model和Entity的公共属性了。
基于前面的内容,接下来我们就开始学习对数据的具体操作了,下面是关于一些基础数据的定义,相信对于你来说已经不陌生了,请在仔细温习一遍吧!
为了方便后面内容的学习和提高您的学习效率,以下基础数据均和后面内容紧密相连,所以必须按照以下结构方式来定义,请勿修改(默认数据库为test,集合为test1)。
&var&mongoose&=&require("mongoose");&&
&var&db&=&mongoose.connect("mongodb://127.0.0.1:27017/test");&
&var&TestSchema&=&new&mongoose.Schema({&&
&&&&&name&:&{&type:String&},&&
&&&&&age&:&{&type:Number,&default:0&},&&
&&&&&email:&{&type:String&},&&
&&&&&time&:&{&type:Date,&default:Date.now&}&
&var&TestModel&=&db.model("test1",&TestSchema&);&
&var&TestEntity&=&new&TestModel({&&
&&&&&name&:&"helloworld",&&
&&&&&age&:&28,&&
&&&&&email:&""&
&TestEntity.save(function(error,doc){&&
&if(error){&&
&&&&console.log("error&:"&+&error);&&
&&&&console.log(doc);&&}&
更多内容和练习请可以看看我写的免费内容:OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;
欢迎您订阅我们的技术周刊
我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,
欢迎分享您的观点,经验,技巧,心得
让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;
本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(
订阅邮件周刊
Mongoose学习参考文档——基础篇
注意 转载须保留原文链接,译文链接,作者译者等信息。&&
Mongoose学习参考文档前言:本学习参考文档仅供参考,如有问题,师请雅正一、快速通道1.1 名词解释Schema
一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力Model
由Schema发布生成的模型,具有抽象属性和行为的数据库操作对Entity
由Model创建的实体,他的操作也会影响数据库注意:1.本学习文档采用严格命名方式来区别不同对象,例如:
var PersonS
//Person的文本属性
var PersonM
//Person的数据库模型
var PersonE
//Person实体2.Schema、Model、Entity的关系请牢记,Schema生成Model,Model创造Entity,Model和Entity都可对数据库操作造成影响,但Model比Entity更具操作性。1.2 准备工作1.首先你必须安装和2.在项目只能够创建一个数据库连接,如下:
var mongoose = require('mongoose');
//引用mongoose模块
var db = mongoose.createConnection('localhost','test'); //创建一个数据库连接3.打开本机localhost的test数据库时,我们可以监测是否有异常
db.on('error',console.error.bind(console,'连接错误:'));
db.once('open',function(){
//一次打开记录
});注意:  成功开启数据库后,就可以执行数据库相应操作,假设以下代码都在回调中处理4.定义一个Schema
var PersonSchema = new mongoose.Schema({
name:String
//定义一个属性name,类型为String
});5.将该Schema发布为Model
var PersonModel = db.model('Person',PersonSchema);
//如果该Model已经发布,则可以直接通过名字索引到,如下:
//var PersonModel = db.model('Person');
//如果没有发布,上一段代码将会异常6.用Model创建Entity
var personEntity = new PersonModel({name:'Krouky'});
//打印这个实体的名字看看
console.log(personEntity.name); //Krouky7.我们甚至可以为此Schema创建方法
//为Schema模型追加speak方法
PersonSchema.methos.speak = function(){
console.log('我的名字叫'+this.name);
var PersonModel = db.model('Person',PersonSchema);
var personEntity = new PersonModel({name:'Krouky'});
personEntity.speak();//我的名字叫Krouky8.Entity是具有具体的数据库操作CRUD的
personEntity.save();
//执行完成后,数据库就有该数据了9.如果要执行查询,需要依赖Model,当然Entity也是可以做到的
PersonModel.find(function(err,persons){
//查询到的所有person
});注意:  1. 具体的如何配置Schema、Model以及Model和Entity的相关操作,我们会在后面进行  2. Model和Entity都有能影响数据库的操作,但仍有区别,后面我们也会做解释二、新手指引  如果您还不清楚Mongoose是如何工作的,请参看第一章快速通道快速浏览他的用法吧1. Schema——纯洁的数据库原型1.1 什么是Schema我理解Schema仅仅只是一断代码,他书写完成后程序依然无法使用,更无法通往数据库端他仅仅只是数据库模型在程序片段中的一种表现,或者是数据属性模型1.2 如何定义Schema
var BlogSchema = new Schema({
title:String,
author:String
//new Schema()中传入一个JSON对象,该对象形如 xxx:yyyy ,
/xxx是一个字符串,定义了属性,yyy是一个Schema.Type,定义了属性类型
});1.3 什么是Schema.Type  Schema.Type是由Mongoose内定的一些数据类型,基本数据类型都在其中,他也内置了一些Mongoose特有的Schema.Type。当然,你也可以自定义Schema.Type,只有满足Schema.Type的类型才能定义在Schema内。1.4 Schema.Types  NodeJS中的基本数据类型都属于Schema.Type,另外Mongoose还定义了自己的类型
var ExampleSchema = new Schema({
name:String,
binary:Buffer,
living:Boolean,
updated:Date,
age:Number,
mixed:Schema.Types.Mixed, //该混合类型等同于nested
_id:Schema.Types.ObjectId,
_fk:Schema.Types.ObjectId,
arrOfString:[String],
arrOfNumber:[Number],
arrOfDate:[Date],
arrOfBuffer:[Buffer],
arrOfBoolean:[Boolean],
arrOfMixed:[Schema.Types.Mixed],
arrOfObjectId:[Schema.Types.ObjectId]
stuff:String,
});1.5 关于Buffer  Buffer和ArrayBuffer是Nodejs两种隐藏的对象,相关内容请查看NodeJS-API1.6 关于Mixed  Schema.Types.Mixed是Mongoose定义个混合类型,该混合类型如果未定义具体形式。因此,如果定义具体内容,就直接使用{}来定义,以下两句等价
var AnySchema = new Schema({any:{}});
var AnySchema = new Schema({any:Schema.Types.Mixed});  混合类型因为没有特定约束,因此可以任意修改,一旦修改了原型,则必须调用markModified()
person.anything = {x:[3,4,{y:'change'}]}
person.markModified('anything');//传入anything,表示该属性类型发生变化
person.save();1.7 关于ObjectId  主键,一种特殊而且非常重要的类型,每个Schema都会默认配置这个属性,属性名为_id,除非自己定义,方可覆盖
var mongoose = require('mongoose');
var ObjectId = mongoose.Schema.Types.ObjectId;
var StudentSchema = new Schema({}); //默认会有_id:ObjectId
var TeacherSchema = new Schema({id:ObjectId});//只有id:ObjectId  该类型的值由系统自己生成,从某种意义上几乎不会重复,生成过程比较复杂,有兴趣的朋友可以查看源码。1.8 关于Array  Array在JavaScript编程语言中并不是数组,而是集合,因此里面可以存入不同的值,以下代码等价:
var ExampleSchema1 = new Schema({array:[]});
var ExampleSchema2 = new Schema({array:Array});
var ExampleSchema3 = new Schema({array:[Schema.Types.Mixed]});
var ExampleSchema4 = new Schema({array:[{}]});1.9 附言  Schema不仅定义了文档结构和使用性能,还可以有扩展插件、实例方法、静态方法、复合索引、文档生命周期钩子  Schema可以定义插件,并且插件具有良好的可拔插性,请有兴趣的读者继续往后阅读或者查阅官方资料。2. Schema的扩展2.1 实例方法  有的时候,我们创造的Schema不仅要为后面的Model和Entity提供公共的属性,还要提供公共的方法。  下面例子比快速通道的例子更加高级,可以进行高级扩展:
var PersonSchema = new Schema({name:String,type:String});
//查询类似数据
PersonSchema.methods.findSimilarTypes = function(cb){
return this.model('Person').find({type:this.type},cb);
}  使用如下:
var PersonModel = mongoose.model('Person',PersonSchema);
var krouky = new PersonModel({name:'krouky',type:'前端工程师'});
krouky.findSimilarTypes(function(err,persons){
//persons中就能查询到其他前端工程师
});2.2 静态方法  静态方法在Model层就能使用,如下:
PersonSchema.statics.findByName = function(name,cb){
this.find({name:new RegExp(name,'i'),cb});
var PersonModel = mongoose.model('Person',PersonSchema);
PersonModel.findByName('krouky',function(err,persons){
//找到所有名字叫krouky的人
});2.3 索引  索引或者复合索引能让搜索更加高效,默认索引就是主键索引ObjectId,属性名为_id, 索引会作为一个专题来讲解2.4 虚拟属性  Schema中如果定义了虚拟属性,那么该属性将不写入数据库,例如:
var PersonSchema = new Schema({
first:String,
last:String
var PersonModel = mongoose.model('Person',PersonSchema);
var krouky = new PersonModel({
name:{first:'krouky',last:'han'}
});  如果每次想使用全名就得这样
console.log(krouky.name.first + ' ' + krouky.name.last);  显然这是很麻烦的,我们可以定义虚拟属性:
PersonSchema.virtual('name.full').get(function(){
return this.name.first + ' ' + this.name.
});  那么就能用krouky.name.full来调用全名了,反之如果知道full,也可以反解first和last属性
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';//会被自动分解
console.log(krouky.name.first);//krouky2.5 配置项  在使用new Schema(config)时,我们可以追加一个参数options来配置Schema的配置,形如:
var ExampleSchema = new Schema(config,options);  或者使用
var ExampleSchema = new Schema(config);
ExampleSchema.set(option,value);  可供配置项有:safe、strict、capped、versionKey、autoIndex2.5.1 safe——安全属性(默认安全)  一般可做如下配置:
new Schema({...},{safe:true});  当然我们也可以这样
new Schema({...},{safe:{j:1,w:2,wtimeout:10000}});  j表示做1份日志,w表示做2个副本(尚不明确),超时时间10秒2.5.2 strict——严格配置(默认启用)  确保Entity的值存入数据库前会被自动验证,如果你没有充足的理由,请不要停用,例子:
var ThingSchema = new Schema({a:String});
var ThingModel = db.model('Thing',SchemaSchema);
var thing = new Thing({iAmNotInTheThingSchema:true});
thing.save();//iAmNotInTheThingSchema这个属性将无法被存储  如果取消严格选项,iAmNotInTheThingSchema将会被存入数据库  该选项也可以在构造实例时使用,例如:
var ThingModel = db.model('Thing');
var thing1 = new ThingModel(doc,true);
//启用严格
var thing2 = new ThingModel(doc,false); //禁用严格注意:  strict也可以设置为throw,表示出现问题将会抛出错误2.5.3 shardKey  需要mongodb做分布式,才会使用该属性2.5.4 capped——上限设置  如果有数据库的批量操作,该属性能限制一次操作的量,例如:
new Schema({...},{capped:1024});
//一次操作上线1024条数据  当然该参数也可是JSON对象,包含size、max、autiIndexId属性
new Schema({...},{capped:{size:1024,max:100,autoIndexId:true}});2.5.5 versionKey——版本锁  版本锁是Mongoose默认配置(__v属性)的,如果你想自己定制,如下:
new Schema({...},{versionKey:'__someElse'});  此时存入数据库的版本锁就不是__v属性,而是__someElse,相当于是给版本锁取名字。  具体怎么存入都是由Mongoose和MongoDB自己决定,当然,这个属性你也可以去除
new Schema({...},{versionKey:false});  除非你知道你在做什么,并且你知道这样做的后果2.5.6 autoIndex——自动索引  该内容将在索引章节单独讲解3. Documents  Document是与MongoDB文档一一对应的模型,Document可等同于Entity,具有属性和操作性注意:  Document的`CRUD都必须经过严格验证的,参看2.5.2 Schema的strict严格配置3.1 查询  查询内容过多,专题讲解3.2 更新  有许多方式来更新文件,以下是常用的传统方式:
PersonModel.findById(id,function(err,person){
person.name = 'MDragon';
person.save(function(err){});
});  这里,利用Model模型查询到了person对象,该对象属于Entity,可以有save操作,如果使用Model`操作,需注意:
PersonModel.findById(id,function(err,person){
person.name = 'MDragon';
var _id = person._ //需要取出主键_id
delete person._
//再将其删除
PersonModel.update({_id:_id},person,function(err){});
//此时才能用Model操作,否则报错
});  update第一个参数是查询条件,第二个参数是更新的对象,但不能更新主键,这就是为什么要删除主键的原因。  当然这样的更新很麻烦,可以使用$set属性来配置,这样也不用先查询,如果更新的数据比较少,可用性还是很好的:
PersonModel.update({_id:_id},{$set:{name:'MDragon'}},function(err){});  需要注意,Document的CRUD操作都是异步执行,callback第一个参数必须是err,而第二个参数各个方法不一样,update的callback第二个参数是更新的数量,如果要返回更新后的对象,则要使用如下方法
Person.findByIdAndUpdate(_id,{$set:{name:'MDragon'}},function(err,person){
console.log(person.name); //MDragon
});  类似的方法还有findByIdAndRemove,如同名字,只能根据id查询并作update/remove操作,操作的数据仅一条3.3 新增  如果是Entity,使用save方法,如果是Model,使用create方法
//使用Entity来增加一条数据
var krouky = new PersonModel({name:'krouky'});
krouky.save(callback);
//使用Model来增加一条数据
var MDragon = {name:'MDragon'};
PersonModel.create(MDragon,callback);  两种新增方法区别在于,如果使用Model新增时,传入的对象只能是纯净的JSON对象,不能是由Model创建的实体,原因是:由Model创建的实体krouky虽然打印是只有{name:'krouky'},但是krouky属于Entity,包含有Schema属性和Model数据库行为模型。如果是使用Model创建的对象,传入时一定会将隐藏属性也存入数据库,虽然3.x追加了默认严格属性,但也不必要增加操作的报错3.4 删除  和新增一样,删除也有2种方式,但Entity和Model都使用remove方法4.Sub Docs  如同SQL数据库中2张表有主外关系,Mongoose将2个Document的嵌套叫做Sub-Docs(子文档)  简单的说就是一个Document嵌套另外一个Document或者Documents:
var ChildSchema1 = new Schema({name:String});
var ChildSchema2 = new Schema({name:String});
var ParentSchema = new Schema({
children1:ChildSchema1,
//嵌套Document
children2:[ChildSchema2]
//嵌套Documents
});  Sub-Docs享受和Documents一样的操作,但是Sub-Docs的操作都由父类去执行
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,他是一个数据库模型对象,因此会先保存chilren2[0]和chilren2[1]。  如果子文档在更新时出现错误,将直接报在父类文档中,可以这样处理:
ChildrenSchema.pre('save',function(next){
if('x' === this.name) return next(new Error('#err:not-x'));
var parent = new ParentModel({children1:{name:'not-x'}});
parent.save(function(err){
console.log(err.message); //#err:not-x
});4.1 查询子文档  如果children是parent的子文档,可以通过如下方法查询到children
var child = parent.children.id(id);4.2 新增、删除、更新  子文档是父文档的一个属性,因此按照属性的操作即可,不同的是在新增父类的时候,子文档是会被先加入进去的。  如果ChildrenSchema是临时的一个子文档,不作为数据库映射集合,可以这样:
var ParentSchema = new Schema({
children:{
name:String
//其实就是匿名混合模式5.Model5.1 什么是Model  Model模型,是经过Schema构造来的,除了Schema定义的数据库骨架以外,还具有数据库行为模型,他相当于管理数据库属性、行为的类5.2 如何创建Model  你必须通过Schema来创建,如下:
//先创建Schema
var TankSchema = new Schema({
name:'String',
size:'String'
//通过Schema创建Model
var TankModel = mongoose.model('Tank',TankSchema);5.2 操作Model  该模型就能直接拿来操作,具体查看API,例如:
var tank = {'something',size:'small'};
TankModel.create(tank);注意:  你可以使用Model来创建Entity,Entity实体是一个特有Model具体对象,但是他并不具备Model的方法,只能用自己的方法。
//通过Model创建Entity
var tankEntity = new TankModel('someother','size:big');
tankEntity.save();6.Query  查询是数据库中运用最多也是最麻烦的地方,这里对Query解读的并不完善,仅仅是自己的一点领悟而已。6.1 查询的方式  通常有2种查询方式,一种是直接查询,一种是链式查询(2种查询都是自己命名的)6.1.1 直接查询  在查询时带有回调函数的,称之为直接查询,查询的条件往往通过API来设定,例如:
PersonModel.findOne({'name.last':'dragon'},'some select',function(err,person){
//如果err==null,则person就能取到数据
});  具体的查询参数,请查询API6.1.2 链式查询  在查询时候,不带回调,而查询条件通过API函数来制定,例如:
var query = PersonModel.findOne({'name.last':'dragon'});
query.select('some select');
query.exec(function(err,pserson){
//如果err==null,则person就能取到数据
});  这种方式相对直接查询,分的比较明细,如果不带callback,则返回query,query没有执行的预编译查询语句,该query对象执行的方法都将返回自己,只有在执行exec方法时才执行查询,而且必须有回调。  因为query的操作始终返回自身,我们可以采用更形象的链式写法
.find({ occupation: /host/ })
.where('name.last').equals('Ghost')
.where('age').gt(17).lt(66)
.where('likes').in(['vaporizing', 'talking'])
.limit(10)
.sort('-occupation')
.select('name occupation')
.exec(callback);7.Validation  数据的存储是需要验证的,不是什么数据都能往数据库里丢或者显示到客户端的,数据的验证需要记住以下规则:验证始终定义在SchemaType中验证是一个内部中间件验证是在一个Document被保存时默认启用的,除非你关闭验证验证是异步递归的,如果你的SubDoc验证失败,Document也将无法保存验证并不关心错误类型,而通过ValidationError这个对象可以访问7.1 验证器required 非空验证min/max 范围验证(边值验证)enum/match 枚举验证/匹配验证validate 自定义验证规则  以下是综合案例:
var PersonSchema = new Schema({
type:'String',
required:true //姓名非空
type:'Nunmer',
//年龄最小18
//年龄最大120
type:'String',
enum:['北京','上海']
//只能是北京、上海人
type:'String',
validate:[validator,err]
//validator是一个验证函数,err是验证失败的错误信息
});7.2 验证失败  如果验证失败,则会返回err信息,err是一个对象该对象属性如下
err.errors
//错误集合(对象)
err.errors.color
//错误属性(Schema的color属性)
err.errors.color.message
//错误属性信息
err.errors.path
//错误属性路径
err.errors.type
//错误类型
//错误名称
err.message
//错误消息  一旦验证失败,Model和Entity都将具有和err一样的errors属性8.Middleware中间件8.1 什么是中间件  中间件是一种控制函数,类似插件,能控制流程中的init、validate、save、remove`方法8.2 中间件的分类  中间件分为两类8.2.1 Serial串行  串行使用pre方法,执行下一个方法使用next调用
var schema = new Schema(...);
schema.pre('save',function(next){
//做点什么
});8.2.2 Parallel并行  并行提供更细粒度的操作
var schema = new Schema(...);
schema.pre('save',function(next,done){
//下一个要执行的中间件并行执行
doAsync(done);
});8.3 中间件特点  一旦定义了中间件,就会在全部中间件执行完后执行其他操作,使用中间件可以雾化模型,避免异步操作的层层迭代嵌套8.4 使用范畴复杂的验证删除有主外关联的doc异步默认某个特定动作触发异步任务,例如触发自定义事件和通知  例如,可以用来做自定义错误处理
schema.pre('save',function(next){
var err = new Eerror('some err');
next(err);
entity.save(function(err){
console.log(err.message); //some err
原文地址:
&热门文章 - 分享最多
&相关阅读 - JS开源
&关键字 - 开源
&欢迎订阅 - 技术周刊
我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;
我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊}

我要回帖

更多关于 nodejs mongoose find 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信