У меня есть база данных coucdb, которая содержит около 200 000 твитов, ключи — это идентификатор твита. У меня есть запрос, который должен получить все документы для поиска некоторой информации. Я использую lightcouch для работы с CouchDB в веб-приложении Java. Если я создам dbClient следующим образом:
List<JsonObject>tweets = dbClient.view("_all_docs").query(JsonObject.class);
а затем прокручивайте твиты, для каждого JsonObject в твитах используйте
JsonObject tweetJson = dbClient.find(JsonObject.class, tweet.get("id").toString().replaceAll("\"", ""));
чтобы получить каждый твит по одному, потребовалось очень много времени для 200000 документов. Если я загружаю все документы в один запрос, используя includeDocs (true)
List<JsonObject>allTweets = dbClient.view("_all_docs").includeDocs(true).query(JsonObject.class);
это вызвало исключение нехватки памяти, поскольку количество документов слишком велико. Итак, как я могу справиться с этой проблемой? Я думаю об использовании limit(5000) для извлечения 5000 документов каждый раз и перебора всей базы данных, но я не знаю, как написать цикл, чтобы продолжать извлекать следующие 5000 после первых 5000 документов. Одним из возможных решений является использование startKey и endKey, но я не понимаю, как их использовать, когда ключ является идентификатором твита.
testPagination
, который используетqueryPage
иisHasNext
, который может быть полезен. - person ssnobody   schedule 11.09.2014