2014-10-17 97 views
4

我使用字符串數組用來保存電子郵件「字符串數組」:貓鼬:指定類型的字段

var user = new Schema({ 
    // other fields... 

    emails: [String] 
}); 

有麻煩更新此字段。再說了,EMAIL1和EMAIL2是價值觀從我的觀點得到:
這非常適用:

user.emails = [email1, email2]; 
user.save(); 
// fields are updated, all good 

這並不:

user.emails[0] = email1; 
user.emails[1] = email2; 
user.save(function(err, savedUser) { 
    console.log(savedUser.emails); // updated array [email1, email2] 
    // but if I retrieve now the user, the 'emails' field will not have above changes. 
}); 

但是,奇怪的是,這個工程:

user.emails = [email1]; 
user.emails[1] = email2; 
user.save(); 
// user.emails == [email1, email2]; 

有人可以解釋爲什麼會發生這種情況嗎?

回答

10

它沒有很好的記錄,但是當操縱數組字段時,您需要確保觸發Mongoose的字段更改檢測,以便它知道數組已被修改並需要保存。

設置直接通過其在方括號索引數組元素沒有標註它修改的,所以你必須手動標誌使用markModified它:

user.emails[0] = email1; 
user.markModified('emails'); 

或者你也可以做到一氣呵成,用貓鼬陣列的set方法:

user.emails.set(0, email1); 

改寫整個陣列領域也觸發它這就是爲什麼這對你的作品:

user.emails = [email1, email2]; 

還有:

user.emails = [email1]; 
user.emails[1] = email2; 

這意味着,這也適用:

user.emails = []; 
user.emails[0] = email1; 
user.emails[1] = email2; 
+0

非常感謝! 你知道嗎?在我的測試中,它不會觸發字段變化檢測? – eagor 2014-10-17 13:30:01

+0

@eagor哪種情況出乎意料地在您的測試中工作? – JohnnyHK 2014-10-17 13:36:48

+0

單獨設置元素(user.emails [0] = email1 ...)。在'dev'環境中沒有效果,但在'test'中運行良好(更新了新檢索對象的數組) – eagor 2014-10-17 13:46:59