2014-01-25 41 views
5

我有3個模式,其中2個模塊有.pre('save')掛鉤將其推入前一個模式。你可以採取與主題,問題的論壇的例子和評論貓鼬模式檢查是否第一次保存模型實例

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的話題,但我實際上只希望這樣做只是第一次。所以在上面的例子中,如果你創建了一個主題,然後是問題,然後是問題的評論,Topic.arr將有2個ID(問題的_id的兩倍),因爲它爲問題保存一次,第二次是由評論的電話觸發,以保存問題

有沒有人知道解決這個問題的方法,或者更具體地說,如果您知道如何在預保存鉤子中解決這個問題,那麼這是否是第一次保存?

+0

可能的重複[確定如果記錄「是新的」在預存保存回調](http://stackoverflow.com/questions/12092772/determine-if-a-record-is-new-in-the- pre-save-callback) – JohnnyHK

回答

9

因此事實證明,如果您願意繼續Google的第二頁,那麼您可以找到任何答案。

有一個屬性定義爲每個文件,稱爲isNew這可以做你可能想象的。所以只需在該方法中添加if (!this.isNew) return next()即可解決問題。

+5

我會抱怨你答案中的第一句話,認爲回覆這樣的人有點粗魯,然後意識到這是你自己的問題哈哈,歡呼!謝謝! – arg20

+0

應該有一個'init'鉤子,你可以添加到你的模型中,但它看起來像是功能壞了:/ https://github.com/Automattic/mongoose/issues/2363 –