javascript - 将新项目推送到 mongoDB 文档数组

标签 javascript angularjs mongodb mongoose mean

我浏览了很多其他的 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点更好。我认为的原因是。

  1. 查询本身指定了我们想要实现的目标。它是 易于阅读。
  2. 保存函数是一个通配符,因此我们不知道它会改变什么。
  3. 如果您获取文档并对其进行操作,然后调用保存它,那么您很有可能会弄乱一些内容 正在处理的文档的其他字段 无意中,第 3 点的情况并非如此。
  4. 对于addToSet,基本上前一点更明显。
  5. 考虑一下并发性,如果多个调用对同一个博客有不同的评论,并且您正在尝试选项 2,那么 您有机会覆盖所做的更改 在您获取文档和保存文档之间。选项 从这个意义上来说,3 更好。

在性能方面,它们都做同样的事情,因此可能没有太多或任何明显的差异。但选项 3 更安全、更清洁。

关于javascript - 将新项目推送到 mongoDB 文档数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40556917/

相关文章:

javascript - Three.js 添加多个几何体

javascript - 作用域的动态变量名

arrays - 如果没有该元素则更新

javascript - ~ 的作用是什么,可以安全使用吗?

javascript - jQuery 下拉菜单动画

javascript - 我无法设置 CSS 来选择选择框选项

javascript - 从使用动态加载的页面进行 Ajax 加载

angularjs - 具有多个 ui-views 的多模块嵌套 ui-router

java - Spring无法创建可执行jar

javascript - 无法解析 mongodb json 响应 - javascript