详解Nodejs mongoose
前言
Mongoose是在nodejs环境下,对mongodb进行便捷操作的对象模型工具。本文介绍解(翻)密(译)Mongoose插件。
Schema
开始我们就要讲到Schema,一个Schema对应的是mongodb的collection(相当于SQLtable),并且定义其结构。
varmongoose=require('mongoose'); varSchema=mongoose.Schema; //定义一个博客结构 varblogSchema=newSchema({ title:String, author:String, body:String, comments:[{body:String,date:Date}], date:{type:Date,default:Date.now}, hidden:Boolean, meta:{ votes:Number, favs:Number } });
Schema可用Type:
.String(ex:'ABCD')
.Number(ex:123)
.Date(ex:newDate)
.Buffer(ex:newBuffer(0))
.Boolean(ex:false)
.Schema.Types.Mixed(ex:{any:{thing:'ok'}})
.Schema.Types.ObjectId(ex:newmongoose.Types.ObjectID)
.Array(ex:[1,2,3])
.Schema.Types.Decimal128
.Map(ex:newMap([['key','value']]))
我们可以通过一段代码,将Schema转化成Model:mongoose.model(modelName,Schema)
varBlog=mongoose.model('Blog',blogSchema);
赋予Schema方法,当方法转成Model的时候,会将方法给予Model
//创建一个变量,Schema varanimalSchema=newSchema({name:String,type:String}); //将方法赋予这个Schema animalSchema.methods.findSimilarTypes=function(cb){ returnthis.model('Animal').find({type:this.type},cb); }; varAnimal=mongoose.model('Animal',animalSchema); vardog=newAnimal({type:'dog'}); dog.findSimilarTypes(function(err,dogs){ console.log(dogs);//woof });
在Schema方法里,不要使用箭头函数,它会重新绑定this。
赋予Schemastatic(静态)方法,我们继续使用上面的例子:
//赋予静态方法,可以再Model不实例化的情况下调用 animalSchema.statics.findByName=function(name,cb){ returnthis.find({name:newRegExp(name,'i')},cb); }; varAnimal=mongoose.model('Animal',animalSchema); Animal.findByName('fido',function(err,animals){ console.log(animals); });
Schema索引index
MongoDB支持二级索引,在mongoose,我们可以将索引定在Schema层。
varanimalSchema=newSchema({ name:String, type:String, tags:{type:[String],index:true}//声明在字段层 }); animalSchema.index({name:1,type:-1});//声明在
使用index(二级索引)的时候记得要disableMongodb的autoIndex。
mongoose.connect('mongodb://user:pass@localhost:port/database',{autoIndex:false}); //或者 mongoose.createConnection('mongodb://user:pass@localhost:port/database',{autoIndex:false}); //或者 animalSchema.set('autoIndex',false); //或者 newSchema({..},{autoIndex:false});
虚拟化
//声明一个Schema varpersonSchema=newSchema({ name:{ first:String, last:String } }); //转成Model varPerson=mongoose.model('Person',personSchema); //实例化Model varaxl=newPerson({ name:{first:'Axl',last:'Rose'} }); //1.如果我们想要打印Person的姓名 console.log(axl.name.first+''+axl.name.last);//AxlRose //2.使用虚拟化,我们声明一个虚拟字段,然后通过get给其赋值 personSchema.virtual('fullName').get(function(){ returnthis.name.first+''+this.name.last; }); console.log(axl.fullName);//AxlRose
别名
varpersonSchema=newSchema({ n:{ type:String, //给予n别名name,n与name指向同一个值 alias:'name' } }); //修改name同样修改n,方向一样 varperson=newPerson({name:'Val'}); console.log(person);//{n:'Val'} console.log(person.toObject({virtuals:true}));//{n:'Val',name:'Val'} console.log(person.name);//"Val" person.name='NotVal'; console.log(person);//{n:'NotVal'} Model&Documents
增
varTank=mongoose.model('Tank',yourSchema); varsmall=newTank({size:'small'}); //使用save的方法 small.save(function(err){ if(err)returnhandleError(err); //saved! }); //或者使用create Tank.create({size:'small'},function(err,small){ if(err)returnhandleError(err); //saved! }); //或者使用insertMany/insertOne Tank.insertMany([{size:'small'}],function(err){ });
删
//deleteOne或者deleteMany Tank.deleteOne({size:'large'},function(err){ if(err)returnhandleError(err); //只删掉符合项的第一条 });
改
Tank.updateOne({size:'large'},{name:'T-90'},function(err,res){ }); //findOneAndUpdate查找出相应的数据,修改,并返还给程序
查
//查提供了多种方式,find,findById,findOne,和where Tank.find({size:'small'}).where('createdDate').gt(oneYearAgo).exec(callback);
总结
以上所述是小编给大家介绍的Nodejsmongoose的相关知识,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!