2012-08-10 75 views
19

引用上刪除的對象讓我們假設我有這樣一個模式:自動刪除MongoDB中

var Person = new Schema({ 
    name: String 
}); 

var Assignment = new Schema({ 
    name: String, 
    person: ObjectID 
}); 

如果我刪除一個人,也仍然可以被孤立的任務留給那些引用不存在的人,這會在數據庫中造成無關緊要的混亂。

是否有一種簡單的方法可以確保刪除某人時,對該人的所有相應引用也將被刪除?

回答

26

您可以在Person模式中添加自己的'remove' Mongoose middleware,以將該人從所有引用它的文檔中移除。在您的中間件功能中,this是正在被刪除的Person文檔。

Person.pre('remove', function(next) { 
    // Remove all the assignment docs that reference the removed person. 
    this.model('Assignment').remove({ person: this._id }, next); 
}); 
+1

如果它包含更深層的對象ID嵌套數組該怎麼辦?像'data:{persons:[{ObjectID}]}'? – vhflat 2017-01-05 18:53:55

+0

@vhflat可能最好發表一個關於這個問題的所有具體問題。 – JohnnyHK 2017-01-10 04:37:22

+0

@JohnnyHK,但併發性呢?如果在人員被刪除時正在創建任務,該怎麼辦?我試圖解決這個問題在我回答這個問題http://stackoverflow.com/q/42521550,但我覺得必須有更好的方法!你能檢查一下嗎? – 2017-03-01 14:39:58

8

如果通過「簡單」你的意思是「內置」,那麼沒有。畢竟,MongoDB並不是一個關係數據庫。您需要實施自己的清潔機制。

0

您可以使用軟刪除。不要從人員集合中刪除人員,而是使用isDelete布爾標誌爲true。