2016-06-09 143 views
1

我有一個貓鼬(使用當前版本)架構與子文檔:貓鼬:刪除子文檔的內容

var mySchema = new Schema({ 
    subdocument: { property1: { type: String } } 
}); 
var myModel = mongoose.model('My-Model', mySchema); 

現在我想更新現有的文件,並刪除subdocument像這樣使用doc.subdocument = {}

new myModel({ name: 'test', subdocument: { property1: 'test' }}).save(function(err, doc) { 
    console.log('saved doc:\n', doc); 
    doc.subdocument = {}; // remove content of subdocument 
    doc.save(function(err, doc) { 
    console.log('updated doc:\n', doc); // subdocument: null 
    myModel.findById(doc._id, function(err, doc) { 
     console.log('retrieved doc:\n', doc); // subdocument: { property1: 'test' } 
     mongoose.disconnect(); 
    }); 
    }); 
}); 

的回調doc.save返回文檔與subdocument: null,所以我估計,更新和預期一樣。但是,在檢查數據庫時,subdocument的內容仍然存在 - 當我再次檢索文檔時,可以通過上面的示例代碼看到這一點。

在DB文件看起來:

{ subdocument: { property1: 'test' }, __v: 0, _id: 57593a8130f2f7b6a12886b1 } 

這是一個錯誤或一個根本性的誤解?

回答

2

我相信模式中的常規JS對象屬性由Mongoose給出Mixed模式類型。

對於這些類型的屬性,如果他們改變,你需要在保存前需要明確地告訴貓鼬有關的變化:

doc.subdocument = {}; 
doc.markModified('subdocument'); 
doc.save(...); 

的「更新文檔」,因爲它是存儲在將反映文檔數據庫,它只是它在內存中的表示方式(它僅僅是對doc對象的另一個參考)。

至於.save()另外,您還可以使用findByIdAndUpdate(),具有額外的好處,你可以把它用new選項返回更新(存儲功能於該數據庫)文件:

myModel.findByIdAndUpdate(doc._id, { 
    $set : { subdocument : {} } 
}, { new : true }, function(err, doc) { 
    // `doc` will now reflect what's stored in the database 
}); 
+0

謝謝你,'markModified'完成了這個訣竅!尤其要感謝返回的「doc」文檔的註釋。直到現在,我還是天真地認爲這是存儲在數據庫中的文檔,所以我必須仔細閱讀我的代碼。 – qqilihq

+1

@qqilihq看到我的編輯,我添加了一個'save'的替代方案,可能也很有用。 – robertklep