【发布时间】:2014-02-16 10:26:39
【问题描述】:
我有 3 个模式,其中 2 个有一个 .pre('save') 挂钩将其 _id 推入前一个模式。您可以以包含主题、问题和 cmets 的论坛为例
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 次调用)就是为 2 个模式中的每一个添加一个 .pre('save') 挂钩,以在它们各自的父模式中添加它们的 _id。
问题:问题是现在,每次我保存评论时,它都会将其 id 推送到主题,但我实际上只想在第一次这样做。因此,在上面的示例中,如果您创建一个主题,然后为它创建一个问题,然后为该问题创建一个评论,Topic.arr 将在其中包含 2 个 id(两倍于问题的 _id),因为它为问题和第二次是由评论调用保存问题触发
有没有人知道解决这个问题的方法,或者更具体地说,如果您知道如何在预保存钩子中确定这是不是第一次保存?
【问题讨论】: