首页 文章

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

提问于
浏览
0

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

  • 0

    你有点自己回答这个问题 .


    添加选项 addOption(DBQuery.Option.noTimeout) 确实会在使用 find 时解决问题,因为它会使 cursor 停止超时,因此当您尝试 .hasNext() 时它将存在

    但是 aggregation for aggregation 没有那个选项,所以你不能阻止它超时 .

  • 0

    你实际上可以使用:maxTimeMS
    如文档中所述:

    可选 . 指定处理游标操作的时间限制(以毫秒为单位) . 如果未指定maxTimeMS的值,则操作不会超时 . 值0显式指定默认的无界行为 .

    mongodb文档中有一个选项,您可以在光标活动的时间内将其设置为非负数 . 你可以看到更多细节:documentation

  • 0

    我有同样的问题,并通过将空闲游标超时从默认的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上执行该命令 .

相关问题