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

标签 java mysql sql mongodb database

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

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

SHA 列包含 50000 条记录,而文件名列为空。我想将此表中的 SHA key 与远程 MongoDB 集合中的 SHA key 进行比较。 规则需要是如果 SHA 存在于 Mongo 集合中,则拉取与该 SHA key 对应的文件名并将其插入到本地 MySQL 中与 SHA key 对应的文件名字段。

目前,我的 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();
    }
  }
}

最佳答案

我会建议,将所有文件名保存在一个数组中。一定要有限制地查找,比如一次按 _id 排序 100 个。

得到结果后,将第 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;
})

关于java - 将 MongoDB 集合中的数据复制到 MySQL 表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39367393/

相关文章:

java - 如何将两个以 .docx 格式保存的 word 文档合并到第三个文件中?

java - 在没有插件的情况下从浏览器运行 Java 程序

php - Laravel 的表特化

sql - Postgresql 选择常量

sql - 使用维恩图来描述表为集合的 SQL 连接是否合适?

java.lang.Exception : No runnable methods exception in running JUnits

java - 从公钥格式到字符串的转换,反之亦然

php - 加载一千个 Cron 脚本的最佳方法

java - SQL/JAVA JDBC通讯链接偶尔出现错误

sql - 如何检查 SQL Server 中的数据是否有回车符和换行符?