Javascript 使用Mongoose更新数组中的子文档
关于这一点,有一些帖子(例如),但没有一篇使用本地猫鼬方法。(第一个使用Javascript 使用Mongoose更新数组中的子文档,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,关于这一点,有一些帖子(例如),但没有一篇使用本地猫鼬方法。(第一个使用$set,第二个使用extendnpm包。似乎应该有一种“原生猫鼬”的方法来实现这一点 模式: 以下是我最初尝试的: BlogPost.findById(req.params.postId, function (err, post) { var subDoc = post.comments.id(req.params.commentId); subDoc = req.body; post.save(f
$set
,第二个使用extend
npm包。似乎应该有一种“原生猫鼬”的方法来实现这一点
模式:
以下是我最初尝试的:
BlogPost.findById(req.params.postId, function (err, post) {
var subDoc = post.comments.id(req.params.commentId);
subDoc = req.body;
post.save(function (err) {
if (err) return res.status(500).send(err);
res.send(post);
});
});
问题是这一行:subDoc=req.body
实际上并没有更改父文档的子文档,而是通过引用传递。调用save()
后,数据库中实际上没有任何更改
extend
包通过将两个对象合并在一起来解决这个问题,如上面链接的第二个SO帖子所示(再次链接)。但是没有办法使用Mongoose API方法来解决这个问题吗?我在文档中找不到关于它的任何内容(只有如何添加新子文档和删除子文档)
我写的另一个选择是:
for (var key in subDoc) {
subDoc[key] = req.body[key] || subDoc[key];
}
这也行,但我不确定这样做是否有什么危险。也许这是最好的方法
提前感谢!之所以
subDoc=req.body
不起作用,是因为它用一个全新的req.body
引用替换了第一次分配给subDoc
时创建的引用(假设它是一个对象而不是字符串).这与猫鼬无关,只是参考文献通常是如何工作的
var objA={a:1,b:2};
var objB={a:'a',b:'b'};
var-objC=objA;
log('Assigning ref to objC from objA',{objA,objB,objC});
//它应记录以下内容:
//从objA向objC分配ref{
//“objA”:{
///**编号:2**/
//“a”:1,
//“b”:2
// },
//“objB”:{
//“a”:“a”,
//“b”:“b”
// },
//“objC”:/**参考号:2**/
// }
//
objC=objB;
log('replacement ref to objC with objB',{objA,objB,objC});
//它应记录以下内容:
//将objC的ref替换为objB{
//“objA”:{
//“a”:1,
//“b”:2
// },
//“objB”:{
///**编号:3**/
//“a”:“a”,
//“b”:“b”
// },
//“objC”:/**参考号:3**/
// }
谢谢!我想我只需要离开电脑一分钟,因为我在吃了一顿丰盛的午餐后想到了.set方法。我一到家就试试这个。@bobbyz运气好吗?还没试过,但我今天进去的时候会试。出于好奇,使用“承诺”而不是“回调”有什么好处?我用在角度和角度上像他们一样,但好处主要在于它的外观,还是它的性能更好?还有,是使用document。在父文档上设置处理PUT请求的首选方法?它会保留req.body中不包含的属性,就像补丁请求一样吗?我想我可以在进入时处理所有这些,但拥有它们会很好另一个声音在里面。@bobbyz有很多问题…谢谢!一切都很好,一切都很有意义。
for (var key in subDoc) {
subDoc[key] = req.body[key] || subDoc[key];
}