Java 将数据从MongoDB集合复制到MySQL表中
我有一个MySQL数据库,其中有一个名为“commit\u files的表,如下所示: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键与远程
+----------+-------------+
| 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;
})