2017-04-21 74 views
1

我有一個蒙戈架構如下訪問,並與鍵更新蒙戈對象

var schema = mongoose.Schema({ 
user: {type:ObjectId, ref: 'User'}, 
preferences: mongoose.Schema.Types.Mixed 
}); 

module.exports = mongoose.model('UserPreference', schema); 

我正在做後期的呼叫與數據

{ 
"newQuestionPrompt": false, 
"oldQuestion": false 
} 

這兩個屬性都需要進行設定成偏好字段,例如

"_id" : ObjectId("58f9d06cf998d9baccf8024f"), 
"user" : ObjectId("58eda68601dc391e27f3e2c4"), 
"preferences":{ 
"newQuestionPrompt": false, 
"oldQuestion": false 
} 

但是,當再次爲同一個用戶再次進行相同的調用時,可能會有en在通話,或使用不同的值相同屬性tirely不同的屬性,如

{ 
    "newQuestionPrompt": true, 
    "randomQuestion": false 
} 

在這種情況下,我需要更新已經存在的屬性值,並添加這不是的,所以早期的對象應該變成

"_id" : ObjectId("58f9d06cf998d9baccf8024f"), 
"user" : ObjectId("58eda68601dc391e27f3e2c4"), 
"preferences":{ 
"newQuestionPrompt": true, 
"oldQuestion": false, 
"randomQuestion": false 
} 

我不能使用$ set preferences:req.body,因爲它會覆蓋整個事情。什麼是實現這一目標的最佳方式?

+0

集Object.assign(oldobjfromdatabase,newobjfromuser) –

+0

嘗試:' 「_id」:物件( 「58f9d06cf998d9baccf8024f」), 「用戶」:物件( 「58eda68601dc391e27f3e2c4」), 「$集」:{ 「preferences.newQuestionPrompt」:假 }' – Titus

+0

如果你使用'preferences.newQuestionPrompt'只有'newQuestionPrompt'屬性將不刪除其他設置屬性。換句話說'preferences.newQuestionPrompt'只會更新'newQuestionPrompt'而不是整個'preferences'對象。 – Titus

回答

0

嘗試來電對象轉換爲具有與dot notation鍵的對象,以便您可以與您的$set更新使用即轉換

{ 
    'newQuestionPrompt': true, 
    'randomQuestion': false 
} 

{ 
    'preference.newQuestionPrompt': true, 
    'preference.randomQuestion': false 
} 

轉換後,您可以在更新中使用它:

UserPreference.findByIdAndUpdate(req.params.id, 
    { 
     '$set': { 
      'preference.newQuestionPrompt': true, 
      'preference.randomQuestion': false 
     } 
    }, 
    { 'new': true }, 
    (err, pref) => { 
     if (err) throw err; 
     console.log(pref); 
    } 
) 

轉換用的對象,你可以試試下面的辦法:

let update = { '$set': {} }; 
let options = { 'new': true }; 
let cb = (err, pref) => { 
    if (err) throw err; 
    console.log(pref); 
}; 

Object.keys(req.body).forEach((key) => { 
    update['$set'][`preference.${key}`] = req.body[key]; 
}); 

UserPreference.findByIdAndUpdate(req.params.id, update, options, cb); 
+1

工程就像一個魅力。謝謝。 – Karthik