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

标签 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

我想我实际上需要一种方法来知道更新是否完成,然后再调用该用户。有什么办法吗?

最佳答案

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

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

关于javascript - Mongo/Mongoose快速更新导致数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36770630/

相关文章:

javascript - 从弹出窗口中删除标题栏和地址栏

Javascript 设置接下来 2 天的日期

javascript - 将 typescript 库捆绑到一个 .js 文件和一个 .d.ts

c# - 在 C# 驱动程序上使用复杂查询从集合中删除文档

javascript - 动态创建 DIV,不是动态获取高度和宽度

mysql - 如何用node-mysql查询并写出结果?

javascript - 使用 nexmo 调用外线电话

MongoDB $从 ObjectID 数组中提取值

mysql - 哪个数据库引擎最适合处理数组值?

javascript - pegjs 正则表达式组内参数的深度标记