使用Mongoose来更新数组中的子文档

有一些关于这个( 这里和这里 ,例如)的post,但没有一个使用本地mongoose方法。 (第一个使用$set ,第二个使用extend npm包,好像应该有一个“native mongoose”的方法来做到这一点。

架构:

 var blogPostSchema = new mongoose.Schema({ title: String, comments: [{ body: String }] }); 

这是我最初的尝试:

 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实际上并没有改变父文档的subDoc,而是通过引用传递。 save()调用后,数据库中没有任何变化。

extend包通过将两个对象合并在一起来解决这个问题,如上面链接的第二个SOpost所示(以及在这里 )。 但是有没有办法解决这个使用一些Mongoose的API方法? 我找不到有关它的任何文档(只有如何添加新的子目录和删除子目录)。

我写的一个select是这样的:

 for (var key in subDoc) { subDoc[key] = req.body[key] || subDoc[key]; } 

这也有效,但我不确定这样做是否有什么危险。 也许这是最好的方法?

提前致谢!

subDoc = req.body不起作用的原因是它将第一个赋值创build的引用replace为对subDoc的全新引用(假设它是对象而不是string)。 这与Mongoose没有任何关系,只是参考文献是如何工作的。

 var objA = { a: 1, b: 2}; var objB = { a: 'A', b: 'B'}; var objC = objA; console.log('Assigning ref to objC from objA', {objA, objB, objC}); // It should console.log the following: // Assigning ref to objC from objA { // "objA": { // /**id:2**/ // "a": 1, // "b": 2 // }, // "objB": { // "a": "A", // "b": "B" // }, // "objC": /**ref:2**/ // } // objC = objB; console.log('Replacing ref to objC with objB', {objA, objB, objC}); // It should console.log the following: // Replacing ref to objC with objB { // "objA": { // "a": 1, // "b": 2 // }, // "objB": { // /**id:3**/ // "a": "A", // "b": "B" // }, // "objC": /**ref:3**/ // }