2017-01-04 4 views
0

現在MongoDB Collectionを経由しているカーソルがあり、別の値を取り出して別のテーブルに追加しています。しかし、プロセスが実行されているときにカーソルがコレクション内のすべてのドキュメントをカバーしていないことがわかりました(カウンタを追加して見つけました)。Mongo DB Java Driverカーソルにフルコレクションが含まれていません

ビーコンルックアップコレクションには3342個のドキュメントがありますが、ロギングからは1114個まで繰り返して表示され、エラーなしでカーソルが終了します。デバッグ時にカーソルを確認すると、3343個のドキュメントがすべて含まれます。何かアドバイスは素晴らしいことだ

public void flattenCollection(){ 

     MongoCollection<Document> beaconLookup = getCollection("BEACON_LOOKUP"); 
     MongoCollection<Document> triggers = getCollection("DIM_TRIGGER"); 

     System.out.println(beaconLookup.count()); 
     // count = 3342 
     long count = beaconLookup.count(); 

     MongoCursor<Document> beaconLookupCursor = beaconLookup.find().batchSize((int) count).noCursorTimeout(true).iterator(); 
     MongoCursor<Document> triggersCursor = triggers.find().iterator(); 
     try { 
      while (beaconLookupCursor.hasNext()) { 
       int major = (Integer) beaconLookupCursor.next().get("MAJOR"); 
       int minor = (Integer) beaconLookupCursor.next().get("MINOR"); 
       if(major==1215) { 
        System.out.println("MAJOR " + major + " MINOR " + minor); 
       } 

       triggers.updateMany(and(eq("MAJOR", major), 
             eq("MINOR", minor)), 
         combine(set("BEACON_UUID",beaconLookupCursor.next().get("UUID")))); 
       count = count - 1; 
       System.out.println(count); 

      } 
     } finally { 
      beaconLookupCursor.close(); 
     } 
    } 

:以下

は、私が実行しようとしており、現在の問題を抱えています方法です!

答えて

2

繰り返しごとにnext()を複数回呼び出しています。

変更

int major = (Integer) beaconLookupCursor.next().get("MAJOR"); 
int minor = (Integer) beaconLookupCursor.next().get("MINOR"); 

Document doc = beaconLookupCursor.next(); 
int major = (Integer) doc.get("MAJOR"); 
int minor = (Integer) doc.get("MINOR"); 

にUUIDのための1つ以上のコールがあるように見えます。参照番号docも更新してください。

+0

ありがとうございました!私は数時間それを見つめた後にコードブラインドされています。 –

関連する問題