我有一个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();
}
}
}

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