Mongo / Mongoose快速更新会导致数据丢失

时间:2016-04-21 13:09:14

标签: javascript node.js mongodb mongoose

我是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用户之前完成。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

当您使用大量写入向MongoDB发送垃圾邮件时,MongoDB 将其排队在内存中,最终会在资源允许的情况下写入所有数据,具体取决于负载和磁盘性能。在尝试阅读之前,您必须等待直到所有数据都已写入。如果您在一段时间后读取数据,您将获得正确的数据。有一个名为write-concern的选项,它与提供有关写请求的确认相关,但不保证写入已完成。请查看:this answer

通过垃圾邮件发送,根据我的经验,我假设您使用for循环发出多个写入查询,在实际情况下遇到的情况非常少