2016-01-20 2 views
2

Я пытаюсь запустить агрегацию в большой коллекции, используя Mongo Java Driver 3.0.4. На маленьких образцах моей коллекции все отлично работает, но когда я попытался выполнить ее во всей коллекции, я закончил с MongoCursorNotFoundException. Я обнаружил, что проблема Cursor в том, что время ожидания и закрытие сервера.MongoDB Java Driver - Как отключить Cursor Timeout в запросе агрегирования?

Однако я не могу понять, как установить этот параметр. Функция 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. 
    } 
}); 

ответ

4

Проверьте это MongoDB JIRA ticket. Вы можете увеличить время простоя курсора из при запуске экземпляра mongod или mongos:

mongod --setParameter cursorTimeoutMillis=<num> 

или

mongos --setParameter cursorTimeoutMillis=<num> 

Если это не вариант, вы можете также запустить следующую команду оболочки:

use admin 
db.runCommand({setParameter:1, cursorTimeoutMillis: <num>}) 
Смежные вопросы