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

但是,我不明白如何设置此选项。 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.
    }
});

最佳答案

检查此MongoDB JIRA ticket。您可以在启动mongodmongos实例时增加空闲光标超时:

mongod --setParameter cursorTimeoutMillis=<num>

要么
mongos --setParameter cursorTimeoutMillis=<num>

如果这不是一个选项,则还可以运行以下shell命令:
use admin
db.runCommand({setParameter:1, cursorTimeoutMillis: <num>})

07-24 14:42