问题描述
通过这个教程学习了解到是用.findAndModify()方法可以实现,并且通过命令行操作也实现了,但是在node项目中怎么写呢?2016.9.8更新------------------------------------------------------------------------------为什么给movie的id赋值的时候调用newID函数获取不到值呢?执行的时候newID('movieId')总是等于undefind,貌似在数据库查询没有返回的时候下面的JS就执行了。如果不用函数,直接把else部分写在.findAndModify()的callback里就能正常获取到值。如果一定要用下面这种写法,newID('movieId')怎么才能获取到值呢?
function newID(indexName){ Counter.findAndModify( {_id: indexName }, [], {$inc:{count:1}}, {new:true}, function (err,obj) {console.log(obj)可以获取到obj.value.count,怎么写才能返回到外部函数? } 怎么写能返回给函数?}app.post(’/admin/movie/new’,function (req, res) { 略...if(id !== ’undefined’){ 略...}else{ _movie = new Movie({_id:newID('movieId'),title:movieObj.title,doctor: movieObj.doctor,country: movieObj.country,year:movieObj.year,poster:movieObj.poster,language:movieObj.language,flash:movieObj.flash,summary:movieObj.summary }) _movie.save(function (err, movie) {if(err){ console.log(err)}res.redirect(’/movie/’+ movie._id) })); }});
问题解答
回答1:我想先问一下你说的自增是一定要1,2,3,4……这样吗?因为默认的ObjectID实际上也是自增的。使用数字序列有其局限性,我在这个问题里解释过为什么。官方文档也有关于这个问题的说明。你的问题不在于驱动本身怎么用,在于事件驱动的理解不正确。
function newID(indexName, callback) { Counter.findAndModify({ _id: indexName}, [], { $inc: {count: 1 }}, { new: true},function(err, obj) { // 错误处理略 console.log(obj) callback(obj.value.count);} }}app.post(’/admin/movie/new’, function(req, res) { // 略... if (id !== ’undefined’) {// 略... } else {newID('movieId', function(id) { _movie = new Movie({_id: id,title: movieObj.title,doctor: movieObj.doctor,country: movieObj.country,year: movieObj.year,poster: movieObj.poster,language: movieObj.language,flash: movieObj.flash,summary: movieObj.summary }); _movie.save(function(err, movie) {if (err) { console.log(err)}res.redirect(’/movie/’ + movie._id); });}); }});回答2:
我的做法,添加一个变量。。。
var i = 0;var IncSchema = new Schema({ _id:{type:Number,/*increment:true,*/default:function () {return i++; }}, name:{type:String,lowercase: true, trim: true,match:/a/},//正则验证,转化为小写,并去掉前后空格 sex:{type:String,enum: [’男’, ’女’, ’unknown’],required:true},//必填并且只能填enum中的值 age:{type:Number,min:0,max:150,default:function () {return Math.floor(Math.random()*150);//min max default可以为一个函数的返回值,是否可以接收参数,参数从何来 }}});