Хотите перебрать половину 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;
}