Хотите перебрать половину mongoDB и перебрать оставшуюся половину с другим запросом

Я получаю эту ошибку:

Исключение в потоке "main" com.mongodb.MongoCursorNotFoundException: не удалось выполнить запрос с кодом ошибки -5 и сообщением об ошибке "Курсор 304054517192 не найден на сервере mongodb2:27017" на сервере mongodb2:27017 по адресу com.mongodb.operation.QueryHelper.translateCommandEx.java:27) на com.mongodb.operation.QueryBatchCursor.getMore(QueryBatchCursor.java:215) на com.mongodb.operation.QueryBatchCursor.hasNext(QueryBatchCursor.java:103) на com.mongodb.MongoBorsCor Java:46) на com.mongodb.DBCursor.hasNext(DBCursor.java:155) на org.jongo.MongoCursor.hasNext(MongoCursor.java:38) на com.abc.Generator.Generate(Generator.java:162) на com.abc.main.main(main.java:72)

что я предполагаю, потому что запрос выполнялся слишком долго.
Так что я планирую запросить монго, используя find() и перебрать половину коллекций.
Тогда я хочу использовать другой find() запросить и перебрать оставшуюся половину коллекций.

Не могли бы вы помочь с тем, как поместить курсор прямо на половину позиции коллекции? Документация, по-видимому, не предоставляет никаких функций для этого.

Я в основном просто использую find() итерирование по коллекции с 100000 записей при подключении к серверу через ssh,

MongoCollection history = jongo.getCollection("historyCollection");
MongoCursor<MyClass> allHistories = history.find().as(MyClass.class);

  //---Iterate thru all histories
  while (allHistories.hasNext()) {
  MyClass oneHistory = allHistories.next();
}

1 ответ

Решение

Решил это, заказав моно коллекции по ObjectId, которые были временными метками. Таким образом, я смог использовать оператор "больше чем" для поиска идентификаторов объектов и разделения итераций.

private MongoCursor<PersonDBO> ReadFewProfilesFromDB(final String objectIdAfterWhichToSearchFrom, final Integer FIND_LIMIT) {

    MongoCursor<PersonDBO> aBatchOfProfiles = null;

    try {
        if (objectIdAfterWhichToSearchFrom.equals(START_OBJECTID_OF_MONGO_BATCHES)) {
            aBatchOfProfiles = personProfile.find().limit(FIND_LIMIT).as(PersonDBO.class);
        } else {
            aBatchOfProfiles = personProfile.find("{_id: {$gt: #}}", new ObjectId(objectIdAfterWhichToSearchFrom)).limit(FIND_LIMIT).as(PersonDBO.class);
        }
    } catch(Exception e) {logger.error("Problem while trying to find {} personProfiles, starting from objectID {}. {}, {}", FIND_LIMIT, objectIdAfterWhichToSearchFrom, e.getMessage(), e.getCause());}

    if (aBatchOfProfiles == null) {
        logger.error("profiles collection is null. Nothing more to iterate OR there was an exception when finding profiles. If exception, there would be an error printed above.");
        return null;
    }         

    return aBatchOfProfiles;
}
Другие вопросы по тегам