mongoose模式检查模型实例是否第一次被保存

我有3个模式,其中2个有一个.pre('save')钩子将其_id放入前一个。 您可以通过主题,问题和评论来举一个论坛的例子

 var topicSchema = new Schema({ arr: {type:[Schema.ObjectId], ref:'Question'}, }); var Topic = new mongoose.model('Topic', topicSchema); var questionSchema = new Schema({ targetId: {type:Schema.ObjectId, ref:'Topic', required:true}, arr: {type:[Schema.ObjectId], ref:'Comment'}, }); var Question = new mongoose.model('Question', questionSchema); var commentSchema = new Schema({ targetId: {type:Schema.ObjectId, ref:'Question', required:true}, }); var Comment = new mongoose.model('Comment', commentSchema); 

现在我想要上面的模式:当我保存一个问题,我想自动推问题的_id到其各自的Topic.arr ,当我保存一个评论,汽车将其推到其各自的Question.arr

我试着用.pre('save')钩子来解决这个问题,如下所示:

 function addPreSave (schema, idProperty, containerProperty) { var modelName = schema.paths[idProperty].options.ref; var model = mongoose.models[modelName]; schema.pre('save', function (next) { model.findById(this[idProperty], function (err, doc) { doc[containerProperty].push(this._id); doc.save(next); }.bind(this)); }); } addPreSave(questionSchema, 'targetId', 'arr'); addPreSave(commentSchema, 'targetId', 'arr'); 

所有上述函数(以及2个调用)都是为两个模式中的每一个添加一个.pre('save')钩子,以将它们的_id添加到它们各自的父代中。


问题是,现在的问题是,每次我发表评论时,都会把它的id放到主题上,但是我只是想第一次这样做。 所以在上面的例子中,如果你创build了一个主题,然后是一个问题,然后是一个问题的评论, Topic.arr将有2个ID(两倍的问题的_id ),因为它保存一次的问题和第二时间是由评论的调用触发的,以保存问题

有没有人知道解决这个问题的方法,或者更具体的说,如果你知道如何在预存储钩子中解决这个问题,那么这是否是第一次保存?

所以事实certificate,如果你愿意去Google第二页 ,你可以find答案

有一个为每个文件定义的属性叫做isNew ,它可以完成你想象的任务。 所以只要在方法中join一个if (!this.isNew) return next()就可以解决这个问题。