Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Mongoose更新数组中的子文档_Javascript_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

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];
}