2017-05-08 165 views
0

我有一個貓鼬文檔,我想用另一個對象更新它的很多領域。像貓鼬 - 保存文檔Object.assign

Model.findById(_id, function (err, doc){ 
    var updateData = {...data} 

    // i do not want to do 
    doc.foo = data.foo; 
    doc.bar = data.bar; 

    // i need something like 
    doc.save(updateData) 
    // or 
    doc.update(updateData) 
    // or 
    doc = {...doc, ...updateData} 
    doc.save(); 

}); 

updateData是一個對象,包含我需要在doc中更新的所有數據。

沒有發現任何文檔相關,最近的是找到一個和更新...

回答

2

假設你data對象擁有所有你想要的文件更新鍵,你爲什麼不嘗試使用Object.assign當你在你的問題的標題提及:

Object.assign(doc, data); 
doc.save(callback); // save is async 

或者你可以使用蒙戈的.findByIAndUpdate()像這樣:

Model.findByIdAndUpdate(id, { $set: data }, callback) 

無論哪種方式,您都可以避免手動設置您要更新的每個屬性。

+0

但我怕'Object.assign'可以覆蓋制定者/吸氣或貓鼬對象的任何重要屬性。這會發生? –

+0

我認爲你應該可以通過'Object.assign' [文檔](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)。 'Object.assign'在目標(在本例中爲你的文檔)的source和'set'上使用'get',因此它**指定**屬性經文只是複製它們,所以它應該遵守任何預定義的getter/setters – Ian

+0

太棒了!我正在考慮使用擴展運算符,例如'{..doc,... data}',但這會創建另一個對象,並且不會保留貓鼬的文檔。 –

0

試試這個

//更新

router.put("/updatestudent/:id", function(req, res) { 
    var id = req.params.id; 
    var obj = req.body; 
    student.findByIdAndUpdate(id, { name: obj.name, emailid: obj.emailid }, 
     function(err) { 
      if (err) { 
       return res.send('error updated student'); 
      } 
      res.send("updated"); 
     }); 
}); 
+0

對不起,但我需要使用當前對象,我試圖不再搜索該項目 –