想要遍历mongoDB的一半,并使用另一个查询迭代其余的一半

时间:2016-03-21 13:34:19

标签: java mongodb jongo

我收到此错误:

  

线程中的异常" main" com.mongodb.MongoCursorNotFoundException:   查询失败,错误代码为-5,错误消息为“光标304054517192”   在服务器上找不到mongodb2:27017'在服务器上mongodb2:27017 at   com.mongodb.operation.QueryHelper.translateCommandException(QueryHelper.java:27)     在   com.mongodb.operation.QueryBatchCursor.getMore(QueryBatchCursor.java:215)     在   com.mongodb.operation.QueryBatchCursor.hasNext(QueryBatchCursor.java:103)     在   com.mongodb.MongoBatchCursorAdapter.hasNext(MongoBatchCursorAdapter.java:46)     在com.mongodb.DBCursor.hasNext(DBCursor.java:155)at   org.jongo.MongoCursor.hasNext(MongoCursor.java:38)at   com.abc.Generator.Generate(Generator.java:162)at   com.abc.main.main(main.java:72)

我认为这是因为查询运行时间过长 因此,我计划使用find()查询mongo并迭代一半的集合 然后我想使用另一个find()查询并迭代剩下的一半集合。

您可以帮忙直接将光标放在收藏的第一个位置吗? The documentation does not seem to provide任何功能。

我基本上只使用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 个答案:

答案 0 :(得分:1)

通过ObjectId排序的Mongo集合来解决它,这是时间戳。这样,我就可以使用大于运算符来查找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;
}