我正在使用本机 Node JS 驱动程序(v. 3.0.10)在 Mongo 3.6.6(在一个小的 Mongo Atlas 集群上,未分片)上运行
我的代码如下所示:
const records = await collection.find({
userId: ObjectId(userId),
status: 'completed',
lastUpdated: {
$exists: true,
$gte: '2018-06-10T21:24:12.000Z'
}
}).toArray();
Run Code Online (Sandbox Code Playgroud)
我偶尔会看到这个错误:
{
"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"
}
}
}
Run Code Online (Sandbox Code Playgroud)
这发生在最多返回几百条记录的查询中。每个记录有几百个字节。
我在网上找了什么问题可能是,但大部分的东西我发现在谈论光标超时对于需要超过10分钟的时间才能完成非常大的操作。我无法从我的日志中确切地说出失败的查询花费了多长时间,但最多只有两秒(可能比这短得多)。
我测试使用与出错的值相同的值运行查询,执行时间explain仅为几毫秒:
"executionStats" : {
"executionSuccess" : true,
"nReturned" : NumberInt(248),
"executionTimeMillis" : NumberInt(3),
"totalKeysExamined" : NumberInt(741),
"totalDocsExamined" : NumberInt(741),
"executionStages" : {...}
},
"allPlansExecution" : []
]
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?间歇性网络延迟会导致此错误吗?我将如何减轻这种情况?谢谢
您可以尝试以下 3 件事:
db.collection.find().noCursorTimeout();
Run Code Online (Sandbox Code Playgroud)
您必须在某个时候使用 cursor.close(); 关闭光标。
b)或者减少批量大小
db.inventory.find().batchSize(10);
Run Code Online (Sandbox Code Playgroud)
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2209 次 |
| 最近记录: |