我正在使用游标使用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
能否正确解析。
我阅读了有关会话和连接超时的信息,并将它们增加到了极高的数字以进行测试。仍然没有变化。
还有什么可能是原因以及如何调试此错误?
答案 0 :(得分:1)
我正在研究相同的错误,并遇到了这个问题:
https://jira.mongodb.org/browse/SERVER-34810
这似乎是服务器问题,需要将mongo至少升级到3.6.6、4.0.1或4.1.1。
另外,非常小的批处理大小(约20个)似乎在某种程度上缓解了该问题。