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

过了一会儿,我在 cursorQuery.hasNext() 行的服务器错误上发现光标不存在。

在查找查询中如果我收到此错误,我可以通过添加来解决addOption(DBQuery.Option.noTimeout) 但是此选项似乎不适用于聚合

请让我知道如何解决或解决此问题。

只是为了提供额外的更新:当说我使用

var cursor = db.collection..aggregate([ ...], {allowDiskUse: true} ).addOption(DBQuery.Option.noTimeout)

我收到此错误 E QUERY TypeError: Object # has no method 'addOption'

但是,当我说我使用

var cursor = db.collection..find({...}, {...}).addOption(DBQuery.Option.noTimeout)

它工作正常。

检查聚合文档 https://docs.mongodb.com/v3.0/reference/method/db.collection.aggregate/ 它说:返回:聚合管道操作最后阶段生成的文档的光标

然后检查光标文档 https://docs.mongodb.com/v3.0/reference/method/cursor.addOption/#cursor.addOption

没有建议聚合游标与查找游标不同,前者不支持 DBQuery.Option.noTimeout。

那么在 mongodb 中是否存在一个错误。任何修复它或有解决方法的方法。

注意mongodb版本是3.0

4

3 回答 3

1

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

默认光标超时为 600000 毫秒 = 10 分钟。你可以用不同的方式改变它:

  • 启动时:mongod --setParameter cursorTimeoutMillis=<num>
    • 或者:mongos --setParameter cursorTimeoutMillis=<num>
  • 或在运行期间,使用 mongo shell:db.adminCommand({setParameter:1, cursorTimeoutMillis: <num>})

Mongos 不会将命令转移到集群的 mongod 上。此外,Primary 不会将命令复制到其副本集成员。因此,您需要在可能运行查询的每个 mongos 和 mongod 上执行该命令。

于 2016-10-17T17:03:13.063 回答
0

你自己已经回答了这个问题。


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

但是cursorforaggregation没有该选项,因此不幸的是您无法阻止它超时。

于 2016-08-03T11:29:29.047 回答
0

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

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

mongodb 文档中有一个选项,您可以在希望光标处于活动状态的时间内将其设置为非负数。您可以在以下位置查看更多详细信息:文档

于 2018-09-15T10:19:37.140 回答