将MongoDB集合中的数据复制到MySQL表中

时间:2016-09-07 10:27:39

标签: java mysql sql mongodb database

我有一个MySQL数据库,其中包含一个名为 commit_files 的表,如下所示:

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

SHA列包含50000条记录,而filename列为空。我想将此表中的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();
    }
  }
}




1 个答案:

答案 0 :(得分:0)

我建议,将所有文件名保存在一个数组中。找到有限制,一次说100,按_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写一点。

编辑:

您可以将查找部分保留在一个功能中,并在需要的地方调用它。

这样的事情也可以尝试:

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;
})