在开发中,除了使用mongoose进行一些基本操作外,就是一些技巧的使用。文章继续mongoose识别(一),下面用到的代码可以参考这篇文章。Virtualfield虚拟场可以从字面意思来理解。它不是真实的字段,不存在于数据库中。但是在使用模型实例查询时,可以灵活使用。注意:此功能是mongoose自带的,与mongo无关。...//添加了一个虚拟全名字段//getfullnameUserSchema.virtual('fullname').get(()=>this.firstname+''+this.lastname)//setfullnameUserSchema.virtual('fullname').set((name)=>letarr=name.split(''),this.firstname=arr[0],this.lastname=arr[1])//读取用户模型.find({}).exec().then(doc=>{console.log(doc[0])})查询结果如下:{_id:5c1dc7248aaf9c2c80fee915,firstname:'Dongpo',lastname:'Su',__v:0}然后,如何获取结果全名呢?可以通过doc[0].fullname获取。如何保存数据?代码如下://模拟AJAX请求保存数据letperson2=newUserModel()person2.fullname='BaiLi'person2.save().then(doc=>console.log(doc)).catch(err=>console.log(err))returnresult:{_id:5c1dd7ef535df51980e9fd98,firstname:'白',lastname:'李',__v:0}这样在开发过程中就不用担心了关于由于字段不匹配问题而修改数据库。这也是它存在的意义。有兴趣的同学可以参考nodeclub中user.js中的用户分类。无需创建字段来保存用户的成绩。可以使用虚类型通过socre计算。Schema中定义一些Model实例的常用方法,大家熟悉mongoose的原理。大家都知道Model的构造函数是在Schema实例的基础上创建的。因此,对于频繁操作的Model实例方法,可以定义在Schema实例上(详见JavaScript原型)。在一个Schema中,经常会有updateAt和createAt等字段。通常,它们会被赋予一个默认值。userSchema代码修改如下:now}})在开发中,开发者往往不会手动处理,而是需要跟踪记录一个数据,而不允许随意修改这些数据。那么,如何操作才是最好的呢?当然最好有一些方法,在执行post请求的时候会按照一定的机制自动保存。而mongoose有这样的机制,可以在Schema实例中添加pre方法,代码如下:UserSchema.pre('save',function(next){letnow=Date.now()this.updateAt=now;if(!this.createAt)this.createAt=now;next()})模拟AJAX请求保存数据:letperson3=newUserModel()person3.fullname='Fudu'person3.save().then(doc=>console.log(doc)).catch(err=>console.log(err))返回结果:{_id:5c1e006204bad42224374aea,createAt:2018-12-22T09:14:10.862Z,updateAt:2018-12-22T09:14:10.877Z,firstname:'Fu',lastname:'Du',__v:0}这个经验并不能说明问题,是Schema定义和pre方法交互作用的结果。尝试更新数据来验证定义的方法,代码如下:UserModel.findOne({lastname:'Du'}).exec().then(function(doc){doc.lastname='Du'doc.firstname='Du'doc.save().then(doc=>{console.log(doc)}).catch(err=>{console.error(err)})}).catch(err=>console.log(err))返回结果:{_id:5c1e006204bad42224374aea,createAt:2018-12-22T09:14:10.862Z,updateAt:2018-12-22T09:15:04.398Z,firstname:'Mu',lastname:'Du',__v:0}在这里,我们使用save来更新数据。当然,这对于跟踪用户的操作行为是非常好的,但是并不是所有的数据都需要,对于那些不需要的,还是可以考虑使用findOneAndUpdate、updatee、updateMany。细心的同学会发现,其实和shell命令的db.users.insert({})类似,user.save({})插入一条数据,后者可以插入多条数据。注意:在使用和操作数据库中的数据时,一定要注意user.find()或者user.findOne()返回的整条数据,才可以进行操作。如果实例化UserModel,则会导致数据库出错。数据丢失。mongoose系列篇mongoose再认识(一)mongoose再认识(二)mongoose再认识(三)
