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

Posted

技术标签:

【中文标题】Mongo/Mongoose 快速更新导致数据丢失【英文标题】:Mongo/Mongoose fast update causes loss of data 【发布时间】:2016-08-14 17:10:21 【问题描述】:

我是 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

我认为我实际上需要一种方法来知道更新是否在调用该用户之前完成。有没有办法做到这一点?

【问题讨论】:

可能是***.com/questions/30419575/…的欺骗 @JohnnyHK 虽然问题很相似,但我没有运气在 findByIdAndUpdate 中使用 'new': true 【参考方案1】:

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

通过垃圾邮件,根据我的经验,我假设您使用 for 循环发出多个写入查询,而这在实际案例中很少遇到

【讨论】:

以上是关于Mongo/Mongoose 快速更新导致数据丢失的主要内容,如果未能解决你的问题,请参考以下文章

如何承诺 Mongo/Mongoose 找到

Mongo/Mongoose Invalid atomic update value 错误

Mongo/Mongoose 中的复杂约束

MongoDB VS MySQL - 为啥 mongo/mongoose 会自动创建数据库和集合?

mongo+mongoose+express

(Mongo/Mongoose) 如何处理等待多个查询的结果