将新条目推入mongoDB文档数组

Pushing new item to a mongoDB document array

本文关键字:文档 数组 mongoDB 新条目      更新时间:2023-09-26

我看了一堆其他的SO帖子,发现了不同的方法来做到这一点,所以我想知道哪种是最受欢迎的。我正在教学生这个,所以我想给他们最好的实践。

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

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

,我想在这个博客的评论数组中添加一个新的评论,我可以想到至少三个主要的方法来实现这一点:

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

2)向/blogs/:blogID/comments端点提交POST请求,其中请求体只是新的评论,找到博客,将评论推送到香草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);
    });
});

我确实找到了这个stackoverflow帖子,其中回答者谈到了选项2和选项3,基本上说只要你可以就使用选项2,这对我来说似乎更简单。(我通常会尽量避免使用那些阻止我使用钩子和其他猫鼬的好东西的方法。)

你觉得怎么样?任何建议吗?

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

  1. 查询本身指定了我们要实现的目标。这是简单易读的。
  2. 保存函数是一个通配符,所以我们不知道它会改变什么。
  3. 如果您获取文档并操作它,然后调用保存它,那么您可能会搞砸一些其他领域的文件在操作过程中无意中,不是第三点的情况。
  4. 在addToSet的情况下,基本上前一点更明显。
  5. 考虑并发性,如果多个调用对同一个博客有不同的评论,你正在尝试选项2,那里您是否有可能重写中所做的更改在获取文档和保存文档之间。选项在这个意义上,3更好。

性能方面,它们都做同样的事情,所以可能没有太多或任何明显的区别。但选项3更安全、更干净。