用mongoose更新来自请求主体的embedded式文档

我疯了,试图找出一个有效的方式来完成这样一个简单的任务与mongoose。

我有一个客户和狗模式,狗embedded在客户文件。 然后,我将一个更新的Dog对象放到服务器上,并尝试用下面的代码更新匹配的embedded对象。

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.' }); }); }); 

这给了我错误“#Dupdate方法在EmbeddedDocuments上不可用”。 好,可以。 所以,因为我不能调用更新合并请求正文与要更新的文档,有什么替代有效地使用请求正文(更新的狗)更新整个文档(基本上是一个合并)。

我不想输出每个属性更新。

更新:

按照Sam的build议,通过NPM安装lodash之后,这个解决scheme对我来说很有效。

 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.' }); }); }); 

这里的问题是你的可变狗不包含任何mongoose的方法,因为mongoose只包裹主文件。

你可以通过使用一个名为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来更改_.merge

另一种实现这一点的方法是使用运算符$ addToSet

看看mongo文档

希望这可以帮助 !