我需要遍历大约5000万条记录,然后复制到另一个数据库并进行更新,所以我正在使用分页来恢复限制为10000的数据,但是游标的方法hasNext有时太慢,大约需要10秒因此每次迭代都比平时花费了很多时间。
这似乎很奇怪,因为它并不总是发生,这证明了我把记录器花了很多时间。在接下来的代码之后,我检查了 “ hasNext = result.hasNext()” 有时比平时花费了很多时间,而其他时间却没有花费时间(0毫秒)。
MongoCursor<Document> result = collSource.find(filter).skip(0).limit(limit).iterator();
boolean hasNext = result.hasNext();
while (hasNext) {
Document document = result.next();
try {
Object id = document.get("_id");
Object objectId;
if (id instanceof String) {
objectId = document.getString("_id");
} else {
objectId = document.getObjectId("_id");
}
if (param.isFlagMigration()) {
writesSource.add(new UpdateOneModel<Document>(
new Document("_id", objectId),
new Document("$set", new Document("Status.replicated", true))));
}
document.remove("_id");// lo removemos ya que mongodb creará uno nuevo por nosotros
Document userParty = document.get("userData", Document.class).get("UserParty", Document.class);
userParty.remove("PartyRegistration");
userParty.remove("PartyCurrentPlan");
userParty.remove("PostalAddress");
userParty.remove("ClaveSol");
userParty.remove("AccessOSE");
userParty.remove("Contact");
userParty.remove("User");
userParty.remove("PartyImage");
userParty.remove("PaymentMeans");
writesTarget.add(new InsertOneModel<Document>(document));
} catch (Exception e) {
logger.error("BSON: {}", document);
throw e;
}
hasNext = result.hasNext();
}
怎么了?我真的很惊讶