我是mongo / mongoose的新手,在更新集合时发现了一个错误。我有这个nodejs代码:
User
.findByIdAndUpdate({ _id: id }, { $set: params })
.select('-password')
.exec(function (error, user) {
return res.json({ user: user });
});
上面的代码在定期更新时效果很好 - 但是当我发送垃圾邮件并发送大量请求时,最后返回的用户数据与我之后获取的用户数据不匹配:
User.findOne(...)
我如何确保不会发生这种情况以及从更新&从User.findOne(...)
获取的数据始终匹配?
由于
编辑:
我添加了{'new':true},如下所示:
User
.findByIdAndUpdate({ _id: id }, { $set: params }, { 'new': true })
.select('-password')
.exec(function (error, user) {
return res.json({ user: user });
});
但是当我垃圾邮件更新然后得到用户时,我仍会得到不同的结果。
编辑2
我想我确实需要一种方法来了解更新是否在调用get用户之前完成。有没有办法做到这一点?
答案 0 :(得分:1)
当您使用大量写入向MongoDB发送垃圾邮件时,MongoDB 将其排队在内存中,最终会在资源允许的情况下写入所有数据,具体取决于负载和磁盘性能。在尝试阅读之前,您必须等待直到所有数据都已写入。如果您在一段时间后读取数据,您将获得正确的数据。有一个名为write-concern
的选项,它与提供有关写请求的确认相关,但不保证写入已完成。请查看:this answer
通过垃圾邮件发送,根据我的经验,我假设您使用for循环发出多个写入查询,在实际情况下遇到的情况非常少。