MongoDB Java驱动程序 - 如何在聚合查询中禁用游标超时?

时间:2016-01-20 19:37:58

标签: java mongodb

我正在尝试使用Mongo Java Driver 3.0.4在大型集合上运行聚合。在我收集的小样本中,一切都很好,但是当我尝试在整个集合中执行它时,我最终得到了MongoCursorNotFoundException。我发现它是Cursor的一个问题,它超时并被服务器关闭。

但是,我无法理解如何设置此选项。 aggregate()函数返回AggregateIterable,它只有useCursor方法似乎有点相关。另一方面,find()函数返回FindIterable,它有一个方便的noCursorTimeout(Boolean)方法。我不明白为什么它在查找上如此简单,但是这个选项在聚合上没有明显的方法。我应该如何确保光标在一段时间后不会失效?

到目前为止我的代码就是这个。

AggregateIterable<Document> iterable = db.getCollection("tweets").aggregate(asList( new Document("$sort", new Document("timestamp_ms", 1)),
        new Document("$group", new Document("_id", "$relatedTrend")
                            .append("count", new Document("$sum", 1))
                            .append("tweets", new Document("$push", new Document("timestamp_millis", "$timestamp_ms")))))).allowDiskUse(true);

iterable.forEach(new Block<Document>() {
    @Override
    public void apply(final Document document) {
    //parse field "tweets" of document and do a lot of calculations.
    }
});

1 个答案:

答案 0 :(得分:4)

检查此MongoDB JIRA ticket。启动mongodmongos

的实例时,可以增加空闲光标超时
mongod --setParameter cursorTimeoutMillis=<num>

mongos --setParameter cursorTimeoutMillis=<num>

如果这不是一个选项,您还可以运行以下shell命令:

use admin
db.runCommand({setParameter:1, cursorTimeoutMillis: <num>})