gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:20:08 25 4
gpt4 key购买 nike

有一些关于此的帖子(例如 herehere),但它们都没有为此使用 native Mongoose 方法。 (第一个使用 $set,第二个使用 extend npm 包。不过似乎应该有一种“原生 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 实际上并没有改变父文档的子文档,而只是通过引用传递。 save() 调用后,数据库实际上没有任何变化。

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

我写的替代方案是这样的:

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

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

提前致谢!

最佳答案

subDoc = req.body 不起作用的原因是它用对 subDoc 的第一个赋值创建的引用替换为对req.body(假设它是一个对象而不是字符串)。这与 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**/
// }

您可以使用 Document.#set method .只需为其提供一个对象(在本例中为 req.body),该对象使用您要设置的值来反射(reflect)文档的结构。

BlogPost.findById(req.params.postId, function(err, post) {
var subDoc = post.comments.id(req.params.commentId);
subDoc.set(req.body);

// Using a promise rather than a callback
post.save().then(function(savedPost) {
res.send(savedPost);
}).catch(function(err) {
res.status(500).send(err);
});
});

关于javascript - 使用 Mongoose 更新数组中的子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40642154/

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