MongoDB CursorNotFound 在 collection.find() 上出现数百个小记录错误

2023-11-30

我正在 Mongo 3.6.6 上运行(在小型 Mongo Atlas 集群上,未分片),使用本机 Node JS 驱动程序(v. 3.0.10)

我的代码如下所示:

const records = await collection.find({
  userId: ObjectId(userId),
  status: 'completed',
  lastUpdated: {
    $exists: true,
    $gte: '2018-06-10T21:24:12.000Z'
  }
}).toArray();

我偶尔会看到这个错误:

{
  "name": "MongoError",
  "message": "cursor id 16621292331349 not found",
  "ok": 0,
  "errmsg": "cursor id 16621292331349 not found",
  "code": 43,
  "codeName": "CursorNotFound",
  "operationTime": "6581469650867978275",
  "$clusterTime": {
    "clusterTime": "6581469650867978275",
    "signature": {
      "hash": "aWuGeAxOib4XWr1AOoowQL8yBmQ=",
      "keyId": "6547661618229018626"
    }
  }
}

对于最多返回几百条记录的查询会发生这种情况。每条记录有几百字节。

我在网上查找了问题所在,但是most of what I found正在谈论需要超过 10 分钟才能完成的非常大的操作的游标超时。我无法从日志中准确判断失败的查询花了多长时间,但最多是两秒(可能比这短得多)。

我测试了使用与出错的值相同的值运行查询以及执行时间explain只有几毫秒:

"executionStats" : {
    "executionSuccess" : true, 
    "nReturned" : NumberInt(248), 
    "executionTimeMillis" : NumberInt(3), 
    "totalKeysExamined" : NumberInt(741), 
    "totalDocsExamined" : NumberInt(741), 
    "executionStages" : {...}
    }, 
    "allPlansExecution" : []
    ]
} 

有任何想法吗?间歇性网络延迟是否会导致此错误?我该如何缓解这种情况?谢谢


你可以尝试以下三件事:


a) 将光标设置为 false

db.collection.find().noCursorTimeout();

您必须在某个时刻使用cursor.close()关闭游标;


b) 或者减少批量大小

db.inventory.find().batchSize(10);

c) 当游标过期时重试:

let processed = 0;
let updated = 0;

while(true) {
    const cursor = db.snapshots.find().sort({ _id: 1 }).skip(processed);

    try {
        while (cursor.hasNext()) {
            const doc = cursor.next();

            ++processed;

            if (doc.stream && doc.roundedDate && !doc.sid) {
                db.snapshots.update({
                    _id: doc._id
                }, { $set: {
                    sid: `${ doc.stream.valueOf() }-${ doc.roundedDate }`
                }});

                ++updated;
            } 
        }

        break; // Done processing all, exit outer loop
    } catch (err) {
        if (err.code !== 43) {
            // Something else than a timeout went wrong. Abort loop.

            throw err;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB CursorNotFound 在 collection.find() 上出现数百个小记录错误 的相关文章

随机推荐

  • 在没有 NodeJS 的情况下使用 EJS

    我认为最新的构建版本将允许我在不使用 Node 的情况下全局使用 ejs 所以我尝试这样做 不过 当我尝试使用 ejs renderFile params 时 我收到错误 TypeError exports fileLoader is no
  • $http 问题 - 在 md-autocomplete Angular Material 中解决承诺之前无法返回值

    我正在使用角度材质md autocomplete在我的项目中 我通过 ajax 调用从服务主机获取建议列表 http服务 Issue http 问题 在承诺之前无法返回值 解决于md autocomplete角材料 我的要求 我需要使用远程
  • WPF 中的高性能绘图控制

    我正在做一些工作 我需要开发一个控件 它应该是一个简单的图表 显示几个点和两条边 我的问题是我需要显示最多 16k 点 更新率为 30 Hz 有没有人做过类似的事情 有什么建议吗 例如 是否从 FrameworkElement 或 Cont
  • Swift:泛型重载,“更专业”的定义

    在下面的例子中 为什么foo f 叫暧昧 我知道第二个重载也可以适用P 但为什么第一个不被认为更专业 因此是更好的匹配 func foo
  • 为什么原来的任务在继续其他任务时被取消了?

    自从我投入 C 编程以来已经 4 周了 确实很有趣 但是 我感到很痛苦 当我开始任务时HttpClient PostAsync 单独使用 效果很好 但如果我继续做其他事情 原来的任务将被取消 而不是由我取消 看起来该任务对继续进行并不满意
  • PHP - 间接修改重载属性

    我知道这个问题已经被问过好几次了 但他们都没有提供解决方法的真正答案 也许有一个适合我的具体情况 我正在构建一个使用魔术方法的映射器类 get 延迟加载其他对象 它看起来像这样 public function get index if is
  • 使用数组过滤对象数组,无需嵌套循环js

    我一直在试图找出在不使用嵌套循环的情况下过滤对象数组的最干净的方法 我找到了这个post using filter关于使用另一个数组过滤数组的函数 但我无法弄清楚如何使用相同的模式实际访问对象数组中的对象内的正确键 给定以下对象数组 tec
  • Kendo UI 重新加载树视图

    我通过 ajax 使用 kendo ui 加载一个复杂的树视图 因为我需要通过一个请求加载树 工作正常 document ready function buildTree function buildTree getJSON admin g
  • 使用 jQuery 延迟更改 insideHTML 文本

    所以我有一个非常简单的按钮 基本上可以打开和关闭表单 我们将在我们的网站上使用它 因为我们正在进行更新并希望在任何页面上提供反馈 这是我迄今为止拥有的 jQuery
  • 具有不同时间戳的重复条目

    我有一个按姓名列出的客户表 Customer SCD在 SQL 中 我其中有 3 列 Customer Name Customer ID Customer TimeStamp 该表中存在不同的重复条目时间戳 例如 ABC 1 2012 12
  • 如何在 ggplot2 中绘制(复杂的)堆叠条形图,无需复杂的手动数据聚合

    我想绘制一个 多面的 堆叠条形图 其中 X 轴以百分比表示 频率标签也显示在条中 经过相当多的工作并查看了 stackoverflow 上的许多不同问题后 我找到了如何使用 ggplot2 解决此问题的解决方案 但是 我不直接使用 ggpl
  • 多维数组转 CSV

    我得到这个数组 array cat gt array 0 gt array name gt Sales url gt http videos volkswagen nl videos videos subs gt array 0 gt ar
  • jQuery toggle() 方法的最佳替代方法?

    jQuery 不推荐使用toggle 方法 这是一种很容易切换类的方法 在搜索 stackoverflow 时 我发现了各种其他方法来完成相同的任务 支持 eventData 的 jQuery toggle 方法的替代方法 哪个 jQuer
  • 为什么在 char 变量中存储 255 在 C 中其值为 -1?

    我正在看一本C书 作者提到了一段文字 if ch a char variable is a signed type then storing 255 in the ch variable gives it the value 1 谁能详细说
  • UTC 时间重置为 2000-01-01 (ruby)。如何防止时间重置?

    我正在使用任务和电子表格 gem 将 Excel 电子表格读入我的数据库 我正在阅读的专栏之一是 start time 为此 我将形成一个值数组 然后逐一传入每个数组值 cnum array for start times sheet1 e
  • ASP.Net MVC 更新下拉选择上的 ViewModel 已更改

    起初我对网络开发完全是新手 我正在尝试开发一个由单个页面组成的 Web 应用程序 我从一个空项目开始尝试遵循 mvc 模式 为了填充我的视图 我通过我的 HomeController 将 ViewModel 传递到我的 Home 视图 现在
  • 如何使用 Plotly 制作带有滑块的分区统计图?

    我正在重新创建等值线示例并尝试添加一个滑块 拖动该滑块时 该滑块会逐年变化 另一位用户问了一个类似的问题但他们没有收到回复 我做了更多搜索并找到了一个example用户生成了额外年份的随机值并创建了一个滑块 但它是用 JavaScript
  • maven-ear-plugin 和 JBoss AS 7

    我正在迁移到 JBoss AS 7 并使用 maven 构建 在我看来 maven ear plugin 还不支持 JBoss AS 7 默认情况下它使用 JBoss AS 4 这会引起问题吗 我还在尝试弄清楚如何构建我的档案 现在遇到了与
  • 在没有互联网连接的情况下创建 Laravel 应用程序

    laravel 5 1 在没有互联网连接的情况下可以工作吗 我喜欢创建一个 Laravel 新应用程序 当我执行 laravel new test 使用 intenet 连接 时 它运行良好 但是当我在没有互联网连接的情况下在同一目录 新的
  • MongoDB CursorNotFound 在 collection.find() 上出现数百个小记录错误

    我正在 Mongo 3 6 6 上运行 在小型 Mongo Atlas 集群上 未分片 使用本机 Node JS 驱动程序 v 3 0 10 我的代码如下所示 const records await collection find user