聚合pipleline错误:getMore:游标在服务器上不存在,可能重启或超时

时间:2016-08-01 16:28:58

标签: mongodb aggregation-framework mongodb-aggregation

我正在与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

3 个答案:

答案 0 :(得分:1)

我有同样的问题并通过将空闲光标超时从默认的10分钟设置为1小时来解决它。这是可配置的,因为mongodb 2.6.9。参见:

默认光标超时为600000 ms = 10分钟。您可以通过不同方式对其进行更改:

  • 启动时:mongod --setParameter cursorTimeoutMillis=<num>
    • 或:mongos --setParameter cursorTimeoutMillis=<num>
  • 或在操作期间,使用mongo shell: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

上查看更多详细信息