2016-03-21 8 views
0

Ich erhalte diesen Fehler wiederholen:Wollen Sie durch die Hälfte der mongoDB und durchlaufen den Rest der Hälfte mit einer anderen Abfrage

Exception in thread "main" com.mongodb.MongoCursorNotFoundException: Query failed with error code -5 and error message 'Cursor 304054517192 not found on server mongodb2:27017' on server mongodb2:27017 at com.mongodb.operation.QueryHelper.translateCommandException(QueryHelper.java:27) at com.mongodb.operation.QueryBatchCursor.getMore(QueryBatchCursor.java:215) at com.mongodb.operation.QueryBatchCursor.hasNext(QueryBatchCursor.java:103) at com.mongodb.MongoBatchCursorAdapter.hasNext(MongoBatchCursorAdapter.java:46) at 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)

, die ich nehme an, weil die Abfrage zu lange lief.
Also ich plane, Mongo mit find() abzufragen und durch die Hälfte der Sammlungen zu iterieren.
Dann möchte ich eine andere find() Abfrage verwenden und durch die verbleibende Hälfte der Sammlungen durchlaufen.

Konnten Sie helfen, wie man den Cursor direkt an die halbe Position der Sammlung setzt? The documentation does not seem to provide irgendwelche Funktionen dafür.

Ich benutze im Grunde nur eine find() und Iterating durch eine Sammlung mit 100000 Datensätze, während mit einem Server über ssh verbunden ist.

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

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

Antwort

0

Gelöst, indem die Mongo-Sammlungen von ObjectId geordnet wurden, die Zeitstempel waren. Auf diese Weise konnte ich den Operator "größer als" verwenden, um Objekt-IDs zu finden und die Iterationen aufzuteilen.

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; 
} 
Verwandte Themen