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

时间:2016-11-11 22:01:37

标签: javascript angularjs mongodb mongoose mean

我查看过其他一些SO帖子并找到了不同的方法来做到这一点,所以我想知道哪个是最优先的。我正在向学生讲这个,所以我想给他们最好的实践。

如果我有以下BlogPost个对象(简体):

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

我希望在此博客的评论数组中添加新评论,我至少可以想到3种方法来完成此任务:

1)将评论推送到Angular中的博客对象,并向PUT端点提交/blogs/:blogID请求,并使用新评论更新整个博客对象。

2)向POST端点提交/blogs/:blogID/comments请求,其中请求正文只是新评论,找到博客,将评论推送到vanilla js中的数组,并保存:< / p>

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);
    });
});

OR

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,这对我来说似乎更简单。 (而且我通常会尽量避免阻止我使用钩子和其他猫鼬好东西的方法。)

你怎么看?有什么建议吗?

1 个答案:

答案 0 :(得分:1)

从应用的角度来看,第3点更好。我认为的原因是。

  1. 查询本身指定了我们要实现的目标。它的 易读。
  2. 保存功能是一张外卡,所以我们不知道它会改变什么。
  3. 如果您获取文档并对其进行操作然后调用保存它,那么外面但很有可能会让您陷入困境 操作过程中文档的其他字段 无意中,不是第3点的情况。
  4. 对于addToSet,基本上前一点更明显。
  5. 考虑并发性,如果多个调用带有对同一个博客的不同评论,并且您正在尝试选项2,那里 您可能会覆盖已完成的更改 你之间获取文件和保存文件。选项 从这个意义上说,3更好。
  6. 性能方面,他们都做同样的事情,所以可能没有太多或任何明显的差异。但是选项3更安全,更清洁。