将新条目推入mongoDB文档数组
Pushing new item to a mongoDB document array
我看了一堆其他的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点更好。我认为原因是……
- 查询本身指定了我们要实现的目标。这是简单易读的。
- 保存函数是一个通配符,所以我们不知道它会改变什么。
- 如果您获取文档并操作它,然后调用保存它,那么您可能会搞砸一些其他领域的文件在操作过程中无意中,不是第三点的情况。
- 在addToSet的情况下,基本上前一点更明显。
- 考虑并发性,如果多个调用对同一个博客有不同的评论,你正在尝试选项2,那里您是否有可能重写中所做的更改在获取文档和保存文档之间。选项在这个意义上,3更好。
性能方面,它们都做同样的事情,所以可能没有太多或任何明显的区别。但选项3更安全、更干净。
相关文章:
- 返回一个关联数组,而不是mongoose中的文档数组
- 如何获取文档数组中元素的计数-MongoDB
- MongoDB findAndModify:>>>查找和更新文档数组中的对象
- 如何在猫鼬.js子文档数组中定义实例方法
- 通过node-js脚本将文档数组插入mongodb中的数据库时出现问题
- 通过 Meteor / Mongo 返回子文档数组
- Meteor:更新文档数组中的嵌套对象
- 通过Javascript中的JSON文档数组&使用KnockoutJS的JQuery
- 如何使用另一个文档数组中的id对光标进行排序
- 将字段插入子文档数组中.意外行为
- 如何从JSON文档数组中提取字段数组
- 如何在Mongodb中返回符合给定条件的子文档数组
- 按筛选的子文档数组元素计数排序
- 将新条目推入mongoDB文档数组
- Meteor AutoForm:如何用子文档数组更新模式值
- 我如何将文档数组更改为MongoDB shell中的值数组
- Mongodb:聚合子文档数组的值
- IBM worklight JSON存储删除文档数组
- 循环一个嵌入文档数组,将新值推入一个字段
- 插入到MongoDB文档数组的前面,没有$position和$each