Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将数据从MongoDB集合复制到MySQL表中_Java_Mysql_Sql_Mongodb_Database - Fatal编程技术网

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

Java 将数据从MongoDB集合复制到MySQL表中,java,mysql,sql,mongodb,database,Java,Mysql,Sql,Mongodb,Database,我有一个MySQL数据库,其中有一个名为“commit\u files的表,如下所示: +----------+-------------+ | Field | Type | +----------+-------------+ | sha | varchar(40) | | filename | text | +----------+-------------+ SHA列包含50000条记录,而filename列为空。我想将此表中的SHA键与远程

我有一个MySQL数据库,其中有一个名为“commit\u files的表,如下所示:

+----------+-------------+
| Field    | Type        |
+----------+-------------+
| sha      | varchar(40) |
| filename | text        | 
+----------+-------------+
SHA列包含50000条记录,而filename列为空。我想将此表中的SHA键与远程MongoDB集合中的SHA键进行比较。 规则需要是,如果Mongo集合中存在SHA,则提取与该SHA键对应的文件名,并将其插入与本地MySQL中的SHA键对应的文件名字段

目前,我使用的Java代码迭代了集合中的所有数据,并将其插入MySQL数据库,但是,由于MongoDB数据库的大小,提取所有数据的效率不高,因为这需要很长时间

我只想获取MySQL中的SHA列表的文件名,我在这方面做得对吗?任何关于如何完成这项工作的想法都会很好。干杯

//从mongo db获取提交文件并插入mysql
DBCollection commits=db.getCollection(“commits”);
DBCursor commitList=commits.find();
System.out.println(“在MongoDB中提交:+commitList.size());
int handledCommit=1;
while(commitList.hasNext()){
DBObject commit=commitList.next();
字符串sha=commit.get(“sha”).toString();
BasicDBList files=(BasicDBList)commit.get(“文件”);
如果(文件!=null){
System.out.println(“提交:“+handleCommit++++”文件:“+files.size()”);
用于(对象f:文件){
DBObject文件=(DBObject)f;
字符串filename=file.get(“filename”).toString();
//插入mysql
字符串mysqlQuery=“插入提交文件(sha,文件名)值(?,)”;
PreparedStatement preparedStmt=mysqlConn.prepareStatement(mysqlQuery);
准备好的固定管柱(1,sha);
preparedStmt.setString(2,文件名);
preparedStmt.execute();
}
}

}
我建议,将所有文件名保留在一个数组中。一定要用limit查找,比如用sort by _id一次查找100个

得到结果后,在某个变量中保留第100个“_id”。下次在find查询中使用
$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写的

编辑:

您可以将find部分保留在一个函数中,并在需要时调用它

您也可以尝试类似的方法:

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