有时游标的com.mongodb.client.MongoCursor.hasNext()方法太慢

时间:2019-05-13 23:24:57

标签: java mongodb

我需要遍历大约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();
        }

怎么了?我真的很惊讶

0 个答案:

没有答案