我想在我的预保存回调中增加一个计数器。我发现这个 stackoverflow 非常有用: Mongoose 是否支持 Mongodb `findAndModify` 方法?
我想做的是使用 findAndModify 方法。但是当我实现静态时,我的回调顺序并不像预期的那样。我总是预先保存然后执行 findAndModify 但我想在预保存挂钩的开始和结束之间执行 findAndModify。如果我定义一个带有回调的通用方法,它会按预期工作。
也与预保存钩子的 done 参数一起工作,没有任何不同的结果
我在这里想念什么
我的代码如下所示:
var mongoose = require('mongoose');
var should = require('should');
mongoose.connect("localhost","test_db");
var CommentSchema = new mongoose.Schema({
content: {type:String},
created_at: {type:Date, default:Date.now},
_post:{type:mongoose.Schema.ObjectId,ref:'Post'}
});
var PostSchema = new mongoose.Schema({
title: {type:String},
content: {type:String},
comments: [{type:mongoose.Schema.ObjectId, ref:'Comment'}],
counter: {type:Number}
});
PostSchema.statics.findAndModify= function(query,sort,doc,options,callback){
return this.collection.findAndModify(query,sort,doc,options,callback);
}
PostSchema.statics.test_me = function(clb){
console.log("test_me");
clb();
}
CommentSchema.pre('save',function(next,done){
console.log("enter pre save comment");
if(this.isNew){
Post.findAndModify({_id:this._post},[],{$inc:{count:1}},{new:true},function(err,post){
console.log("enter find-and-modify!");
console.log(post);
});
Post.test_me(function(){
console.log("callback of test_me");
});
console.log("exit pre save comment");
next();
}
});
var Post = mongoose.model('Post',PostSchema);
var Comment = mongoose.model('Comment',CommentSchema);
var post = new Post({title:"hello world"});
var comment = new Comment({content:"1st comment",_post:post});
post.comments.push(comment);
var id = post.id;
console.log(id);
post.save(function(err){
comment.save(function(err){
Post.find({_id:id })
.populate('comments')
.exec(function(err,result){
console.log("--------------- result -----------------");
console.log(result);
});
});
});
这是我的命令行的结果:
5049f0d2e21547430a000001
enter pre save comment
test_me
callback of test_me
exit pre save comment
enter find-and-modify!
{ __v: 0,
_id: 5049f0d2e21547430a000001,
comments: [ 5049f0d2e21547430a000002 ],
count: 1,
title: 'hello world' }
--------------- result -----------------
[ { __v: 0,
_id: 5049f0d2e21547430a000001,
count: 1,
title: 'hello world',
comments:
[ { content: '1st comment',
_post: 5049f0d2e21547430a000001,
_id: 5049f0d2e21547430a000002,
__v: 0,
created_at: Fri Sep 07 2012 15:04:18 GMT+0200 (CEST) } ] } ]
编辑:我不想知道如何用 test_me 按顺序执行 findAndModify。我想知道为什么 findAndMody 在预保存完成后进入。即使它是嵌入式的,也应该像 test_me 方法所展示的那样工作。所以 test_me 方法应该说明异步方法应该嵌套工作......但 findAndModify 不......就像我的命令行输出显示的那样......它总是在预保存退出后进入 findAndModify 即使我使用 done()打回来...