2016-09-07 6 views
2

私はこのようになりますcommit_filesをという名前のテーブルを持つMySQLデータベースを持っている:ファイル名の列が空のときコピーデータ

+----------+-------------+ 
| Field | Type  | 
+----------+-------------+ 
| sha  | varchar(40) | 
| filename | text  | 
+----------+-------------+ 

SHA欄には、50000件のレコードが含まれます。この表のSHAキーとリモートのMongoDBコレクションのSHAキーを比較したいと思います。 SHAがMongoコレクションに存在する場合、ルールはそのSHAキーに対応するファイル名を取り出し、ローカルMySQLのSHAキーに対応するファイル名フィールドに挿入する必要があります。

現在のところ、Javaコードでは、コレクション内のすべてのデータを繰り返してMySQLデータベースに挿入していますが、MongoDBデータベースのサイズによって、すべてを引き出すのは効率的ではありません。長い時間。

MySQLで使用しているSHAリストのファイル名のみを取得したいと思っています。私はここで適切なトラックにいますか?どのようにこれを完了するための任意のアイデアは素晴らしいだろう。乾杯

//get commit files from mongo db and insert into mysql 
 
DBCollection commits = db.getCollection("commits"); 
 

 
DBCursor commitList = commits.find(); 
 
System.out.println("Commits in MongoDB: " + commitList.size()); 
 
int handledCommit = 1; 
 

 
while (commitList.hasNext()) { 
 
    DBObject commit = commitList.next(); 
 

 
    String sha = commit.get("sha").toString(); 
 
    BasicDBList files = (BasicDBList) commit.get("files"); 
 
    if (files != null) { 
 
    System.out.println("commit: " + handledCommit+++" files: " + files.size()); 
 
    for (Object f: files) { 
 
     DBObject file = (DBObject) f; 
 
     String filename = file.get("filename").toString(); 
 

 
     // insert into mysql 
 

 
     String mysqlQuery = " insert into commit_files (sha, filename) values (?, ?)"; 
 
     PreparedStatement preparedStmt = mysqlConn.prepareStatement(mysqlQuery); 
 
     preparedStmt.setString(1, sha); 
 
     preparedStmt.setString(2, filename); 
 
     preparedStmt.execute(); 
 
    } 
 
    } 
 
}

答えて

0

私は、提案アレイ内のすべてのファイル名を維持します。制限付きで見つけてください。一度に一度に_idでソートしてください。

結果を取得すると、一部の変数に100番目の '_id'を保持します。次回は$gtを検索クエリに使用して100を超える結果が得られます。私はあなたに質問を見つけることを示します。

var arr = [Your sha values] //Keep proper value 
var lastUid; 

db.coll.find({sha:{'$in' : arr}}).limit(100).sort(_id : 1).toArray(function(err, results){ // results is an array of objects 
    lastUid = results[100]._id; 
}) 

あなたのコードで行われた後、あなたは、この次のクエリを試すことができます。これはあなたを助けることができるかどう

db.coll.find({sha:{'$in' : arr}, _id:{$gt : lastUid}}).limit(100).sort(_id : 1).toArray(function(err, results){ 
    lastUid = results[100]._id; 
}) 

を参照してください。

私はJavaを知らないので、javascript li'l bitで書かれています。

EDIT:

あなたは1つの関数に検索部分を維持し、あなたが必要な場所にそれを呼び出すことができます。このような

何かはまた、あなたが試すことができます:

var findQuery = {sha:{'$in' : arr}}, someMore; 

if(lastUid) findQuery['$gt '] = lastUid; 

db.coll.find().limit(100).sort(_id : 1).toArray(function(err, results){ 
    someMore = result[100]._id; 
}) 
関連する問題