gpt4 book ai didi

node.js - 使用 Mongoose 更新请求正文中的嵌入文档

转载 作者:太空宇宙 更新时间:2023-11-03 23:06:38 25 4
gpt4 key购买 nike

我正在疯狂地尝试找出一种有效的方法来使用 Mongoose 完成如此简单的任务。

我有一个客户和狗架构,狗嵌入在客户文档中。然后,我将更新的 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 将请求正文与要更新的文档合并,那么使用请求正文(更新的狗)有效更新整个文档(基本上是合并)的替代方法是什么。

我不想键入要更新的每个属性。

更新:

按照 Sam 的建议通过 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.'
});
});
});

最佳答案

这里的问题是你的变量dog没有用任何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

take a look at the mongo documentation

希望这有帮助!

关于node.js - 使用 Mongoose 更新请求正文中的嵌入文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33155463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com