使用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**/ // }