MongoDB出现随机CursorNotFound错误

时间:2018-06-19 16:54:06

标签: node.js mongodb

我正在使用游标使用mongodb遍历NodeJS中的超过30k个文档,并在此迭代期间在processFn中写入其他文档。

示例代码:

const cursor = collection
    .find({}, { timeout: false })
    .addCursorFlag('noCursorTimeout', true);

while (await cursor.hasNext()) {
    const doc = await cursor.next();
    await processFn({ id: doc._id.toHexString(), ...doc });
}

await cursor.close();

由于未知原因,我得到了CursorNotFound(43)随机错误。

{   MongoError: cursor id 54902755976 not found
name: 'MongoError',
message: 'cursor id 54902755976 not found',
ok: 0,
errmsg: 'cursor id 54902755976 not found',
code: 43,
codeName: 'CursorNotFound' }

at /###/node_modules/mongodb-core/lib/connection/pool.js:593:63
at authenticateStragglers (/###/node_modules/mongodb-core/lib/connection/pool.js:516:16)
at Connection.messageHandler (/###/node_modules/mongodb-core/lib/connection/pool.js:552:5)
at emitMessageHandler (/###/node_modules/mongodb-core/lib/connection/connection.js:309:10)
at Socket.<anonymous> (/###/node_modules/mongodb-core/lib/connection/connection.js:452:17)
at Socket.emit (events.js:180:13)
at addChunk (_stream_readable.js:274:12)
at readableAddChunk (_stream_readable.js:261:11)
at Socket.Readable.push (_stream_readable.js:218:10)
at TCP.onread (net.js:581:20)

我已经检查了它们不是超时。它们总是在少于5分钟后发生。另外,cursor.metrics表示只有一个游标处于打开状态,并且该游标已启用noCursorTimeout

我还检查了processFn能否正确解析。

我阅读了有关会话和连接超时的信息,并将它们增加到了极高的数字以进行测试。仍然没有变化。

还有什么可能是原因以及如何调试此错误?

1 个答案:

答案 0 :(得分:1)

我正在研究相同的错误,并遇到了这个问题:

https://jira.mongodb.org/browse/SERVER-34810

这似乎是服务器问题,需要将mongo至少升级到3.6.6、4.0.1或4.1.1。

另外,非常小的批处理大小(约20个)似乎在某种程度上缓解了该问题。