find() を制限していないため、クエリが壊れます。サーバーにカーソルを作成すると、mongod は結果セット全体をメモリにロードしようとします。コレクションが大きすぎる場合、これにより問題が発生したり、失敗したりします。
これを回避するには、スキップ/制限ループを使用します。Java での例を次に示します。
long count = 0
while (true) {
MongoClient client = new MongoClient();
DBCursor = client.getDB("your_DB_name").getCollection("mongo_collection").find().sort(new BasicDBObject("$natural", 1)).skip(count).limit(100);
while (cursor.hasNext()) {
client.getDB("your_DB_name").getCollection("mongo_his_collection").insert(cursor.next());
count++;
}
}
これは機能しますが、書き込みもバッチ処理することでパフォーマンスが向上します。これを行うには、カーソルから DBObject の配列を作成し、1 回の挿入で一度にすべて書き込みます。
また、コピー中にコレクションが変更されている場合、すべてのドキュメントをトラバースするという保証はありません。ドキュメントのサイズが大きくなると一部が移動してしまう可能性があるためです。