2015-10-15 62 views
1

我瘋了,試圖找出一種有效的方式來完成這樣一個簡單的任務與貓鼬。使用貓鼬更新來自請求主體的嵌入文檔

我有一個客戶和狗架構,狗嵌入在客戶文件。然後,我將一個更新的Dog對象放入服務器,並嘗試使用以下代碼更新匹配的嵌入對象。

Customer.findById(req.params.cust_id).exec(function(err, customer) { 
      if (err) return next(err); 
      var dog = customer.dogs.id(req.params.dog_id) 
      dog.update(req.body, function(err, dog) { 
       if (err) return next(err); 
       res.json({ 
        message: 'Dog updated.' 
       }); 
      }); 
     }); 

這使我的錯誤「#UPDATE方法不適用於EmbeddedDocuments」。好,可以。因此,由於我無法調用update來將請求主體與要更新的文檔合併,因此使用請求主體(更新後的狗)高效地更新整個文檔(基本上是合併)的替代方法是什麼。

我不想輸出每個屬性來更新。

UPDATE:

通過NPM安裝lodash薩姆建議後,該解決方案爲我工作!

Customer.findById(req.params.cust_id).exec(function(err, customer) { 
      if (err) return next(err); 

      var dog = customer.dogs.id(req.params.dog_id) 
      _.merge(dog, req.body); 

      customer.save(function(err, customer) { 
       if (err) return next(err); 
       res.json({ 
        message: 'Dog updated.' 
       }); 
      }); 
     }); 

回答

2

這裏的問題是你的變量狗沒有用任何貓鼬方法包裝,因爲貓鼬只能包裝主文檔。如果它不工作的方式,你想看看lodash文獻,也嘗試改變

var _ = require('lodash'); 
exports.update = function(req, res) { 
if(req.body._id) { delete req.body._id; } 
    Customer.findById(req.params.id, function (err, customer) { 
    if (err) { return handleError(res, err); } 
    if(!customer) { return res.send(404); } 
    var updated = _.merge(customer, req.body); // lodash merge method update matching fields with the new value 
    updated.save(function (err) { 
     if (err) { return handleError(res, err); } 
     return res.json(200, customer); 
    }); 
    }); 
}; 

_:

您可以通過使用一種稱爲lodash

這樣的小圖書館實現這一目標。通過_.extend合併或_.assign

另一種方式來實現這一目標是通過使用操作$ addToSet

take a look at the mongo documentation

希望這有助於!