我正在与mongodb面对这个问题 . 我的代码是这样的
for(loop) {
var cursorQuery = db.beacon_0000.aggregate([
{
$match: {
...
}
},
{
$project: {
...
}
},
{
$group: {
...
}
},
{
$sort: {
...
}
}
], {allowDiskUse: true} );
...
while(cursorQuery.hasNext()) {
var cursor = cursorQuery.next();
...
}
}
我通过命令和mongo shell运行上面的查询
$ mongo dbName file.js
过了一会儿,我得到游标在cursorcam.hasNext()行上的服务器错误上不存在 .
在查找查询中,如果我收到此错误,我可以通过添加_2842589解决此问题但是此选项似乎不适用于聚合
请让我知道如何解决或解决此问题 .
只是为了提供额外的更新:当我说使用时
var cursor = db.collection..aggregate([ ...], {allowDiskUse: true} ).addOption(DBQuery.Option.noTimeout)
我收到此错误E QUERY TypeError:Object#没有方法'addOption'
但是说我用的时候
var cursor = db.collection..find({...}, {...}).addOption(DBQuery.Option.noTimeout)
它工作正常 .
检查聚合文档https://docs.mongodb.com/v3.0/reference/method/db.collection.aggregate/它说:返回:聚合管道操作最后阶段生成的文档的游标
然后检查光标doc https://docs.mongodb.com/v3.0/reference/method/cursor.addOption/#cursor.addOption
没有建议聚合游标与查找游标不同,前者不支持DBQuery.Option.noTimeout .
那么在mongodb上有一个错误吗?任何解决方法或解决方法 .
注意mongodb版本是3.0
3 回答
你有点自己回答这个问题 .
添加选项
addOption(DBQuery.Option.noTimeout)
确实会在使用find
时解决问题,因为它会使cursor
停止超时,因此当您尝试.hasNext()
时它将存在但是
aggregation
foraggregation
没有那个选项,所以你不能阻止它超时 .你实际上可以使用:maxTimeMS
如文档中所述:
mongodb文档中有一个选项,您可以在光标活动的时间内将其设置为非负数 . 你可以看到更多细节:documentation
我有同样的问题,并通过将空闲游标超时从默认的10分钟设置为1小时来解决它 . 这是可配置的,因为mongodb 2.6.9 . 看到:
https://jira.mongodb.org/browse/SERVER-8188
https://docs.mongodb.com/manual/reference/parameters/#param.cursorTimeoutMillis
默认光标超时为600000 ms = 10分钟 . 您可以通过不同方式更改它:
启动时:
mongod --setParameter cursorTimeoutMillis=<num>
或:
mongos --setParameter cursorTimeoutMillis=<num>
或在操作期间,使用mongo shell:
db.adminCommand({setParameter:1, cursorTimeoutMillis: <num>})
Mongos没有将命令传输到群集的mongod . 主节点也不会将命令复制到其replicaSet成员 . 因此,您需要在可能运行查询的每个mongos和mongod上执行该命令 .