2013-10-31 247 views
2

考慮以下方案貓鼬,更新子文檔

Var Schema = new Schema({ 
    username: {Type: String}, 
    ... 
    ... 
    contacts: { 
    email: {Type: String}, 
    skype: {Type: String} 
    } 
    }) 

由於每個用戶都可以說出只有一個電子郵件和Skype我不希望使用陣列接觸。

丟棄的數據庫查詢和錯誤處理我嘗試做一些像

// var user is the user document found by id 
var newValue = '[email protected]'; 
user['username'] = newValue; 
user['contacts.$.email'] = newValue; 
console.log(user['username']); // logs [email protected]  
console.log(user['contacts.$.email']); // logs [email protected] 
user.save(...); 

不會發生錯誤和用戶名被成功更新,而接觸子文檔仍然是空的。 我在那裏想念什麼?

回答

5

從通道中取出$指數contacts不是一個數組,並使用set方法,而不是試圖使用路徑直接操縱的user屬性:

var newValue = '[email protected]'; 
user.set('contacts.email', newValue); 
user.save(...); 

或者你可以修改嵌入式email場直接:

var newValue = '[email protected]'; 
user.contacts.email = newValue; 
user.save(...); 

如果它不只是在你的問題一個錯字,你的另一個問題是,你需要使用type而不是Type在您的架構定義中。所以它應該是:

var Schema = new Schema({ 
    username: {type: String}, 
    ... 
    ... 
    contacts: { 
    email: {type: String}, 
    skype: {type: String} 
    } 
    }); 
+0

謝謝,user.set(key,newValue)適合我。但是,請注意,直接修改user.contacts.email = newValue不起作用。 –

+0

然後,您的架構定義出現問題。看到我更新的答案。 – JohnnyHK

+0

是的,我的模式與你的定義完全一樣,使用小寫't'定義類型。當然,在原始問題上有錯別字。無論如何,user.set()運行良好,在我的情況下更好,因爲它需要更少的代碼。 –