我正在与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
过了一会儿,我得到了游标在cursorQuery.hasNext()行的服务器错误上不存在。
在查找查询中如果我收到此错误,我可以通过添加addOption(DBQuery.Option.noTimeout)
来解决
但是,此选项似乎不适用于聚合
请让我知道如何解决或解决此问题。
只是为了提供额外的更新: 当我说我用
时var cursor = db.collection..aggregate([ ...], {allowDiskUse: true} ).addOption(DBQuery.Option.noTimeout)
我收到此错误 E QUERY TypeError:对象#没有方法' 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
答案 0 :(得分:1)
我有同样的问题并通过将空闲光标超时从默认的10分钟设置为1小时来解决它。这是可配置的,因为mongodb 2.6.9。参见:
默认光标超时为600000 ms = 10分钟。您可以通过不同方式对其进行更改:
mongod --setParameter cursorTimeoutMillis=<num>
mongos --setParameter cursorTimeoutMillis=<num>
db.adminCommand({setParameter:1, cursorTimeoutMillis: <num>})
Mongos没有将命令传输到群集的mongod。主节点也不会将命令复制到其replicaSet成员。因此,您需要在可能运行查询的每个mongos和mongod上执行该命令。
答案 1 :(得分:0)
你有点自己回答。
添加选项addOption(DBQuery.Option.noTimeout)
确实会在使用find
时解决问题,因为它会阻止cursor
超时,因此当您尝试.hasNext()
时它会存在
然而,cursor
的{{1}}没有该选项,因此您无法阻止它超时。
答案 2 :(得分:0)
您可以实际使用:maxTimeMS
如文档中所述:
可选。指定用于游标的处理操作的时间限制(以毫秒为单位)。如果未为maxTimeMS指定值,则操作不会超时。值0明确指定默认的无限制行为。
mongodb文档中有一个选项,您可以在希望光标处于活动状态时将其设置为非负数。 您可以在documentation
上查看更多详细信息