我浏览了很多其他的 SO 帖子,并找到了不同的方法来做到这一点,所以我想知道哪个是最优选的。我正在向学生教授这一点,因此我想为他们提供最佳实践。
如果我有以下 BlogPost
对象(简化):
var BlogPostSchema = new mongoose.Schema({
body: String,
comments: [String]
});
并且我想向此博客的评论数组添加新评论,我可以想到至少 3 种主要方法来实现此目的:
1) 将评论推送到 Angular 中的博客对象,并向 /blogs/:blogID
端点提交 PUT
请求,用新的值更新整个博客对象包括评论。
2) 向 /blogs/:blogID/comments
端点提交 POST
请求,其中请求正文只是新评论,找到博客,推送评论到 vanilla js 中的数组,并保存它:
BlogPost.findById(req.params.blogID, function(err, blogPost) {
blogPost.comments.push(req.body);
blogPost.save(function(err) {
if (err) return res.status(500).send(err);
res.send(blogPost);
});
});
或者
3) 使用新评论的请求正文将 POST
提交到 /blogs/:blogID/comments
端点,然后使用 MongoDB 的 $push
或 $addToSet
将推荐添加到评论数组中:
BlogPost.findByIdAndUpdate(
req.params.blogID,
{$push: {comments: req.body}},
{safe: true, new: true},
function(err, blogPost) {
if (err) return res.status(500).send(err);
res.send(blogPost);
});
});
我确实找到了this stackoverflow post回答者谈论选项 2 与选项 3,基本上是说只要有可能就使用选项 2,这对我来说似乎更简单。 (我通常会尽量避免使用钩子(Hook)和其他 Mongoose 好东西的方法。)
你觉得怎么样?有什么建议吗?
最佳答案
从应用 Angular 来看,第3点更好。我认为的原因是。
- 查询本身指定了我们想要实现的目标。它是 易于阅读。
- 保存函数是一个通配符,因此我们不知道它会改变什么。
- 如果您获取文档并对其进行操作,然后调用保存它,那么您很有可能会弄乱一些内容 正在处理的文档的其他字段 无意中,第 3 点的情况并非如此。
- 对于addToSet,基本上前一点更明显。
- 考虑一下并发性,如果多个调用对同一个博客有不同的评论,并且您正在尝试选项 2,那么 您有机会覆盖所做的更改 在您获取文档和保存文档之间。选项 从这个意义上来说,3 更好。
在性能方面,它们都做同样的事情,因此可能没有太多或任何明显的差异。但选项 3 更安全、更清洁。
关于javascript - 将新项目推送到 mongoDB 文档数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40556917/