MongoDB写入问题:不同的DB对同一文档显示不同的计数

时间:2018-07-12 19:33:30

标签: mongodb mongodb-java mongodb-replica-set mongodb-security

我试图在MongoDB的2个数据库中批量插入不同集合中的某些文档。

MongoClient mongoClient2 = this.getMongoClient();
MongoDatabase currentDB = mongoClient2.getDatabase(splits[0]);
MongoCollection<Document> currentCollectionNew = currentDB.getCollection(splits[1])
                        .withWriteConcern(WriteConcern.MAJORITY.withJournal(true))
                        .withReadConcern(ReadConcern.MAJORITY);

BulkWriteOptions bulkWriteOptions = new BulkWriteOptions();
bulkWriteOptions.ordered(true);
bulkWriteOptions.bypassDocumentValidation(true);
try {
     BulkWriteResult bulkWriteResult = urrentCollectionNew.bulkWrite(listDoc,
                            bulkWriteOptions);

   logger.info("bulkWriteResult inserted count in MAIN: " + bulkWriteResult.getInsertedCount());
   logger.info("bulkWriteResult modified count  in MAIN: " + bulkWriteResult.getModifiedCount());
   logger.info("bulkWriteResult matched count in MAIN : " + bulkWriteResult.getMatchedCount());
   logger.info("bulkWriteResult deleted count in MAIN : " + bulkWriteResult.getDeletedCount());
    logger.info("bulkWriteResult upserted count in MAIN : " + bulkWriteResult.getUpserts().size());
    logger.info("bulkWriteResult was acknowledged in MAIN : " + bulkWriteResult.wasAcknowledged());

    mongoClient2.close()
 } catch (Exception e) {
    logger.warn("Error in bulkWriting main DB: {} ", e.getMessage());
    logger.error(e.getMessage(), e);
                }

    MongoCollection<Document> mongoStageCollection = objFactory.getCollectionObject(resourceType, true);
    String[] splitsStage = mongoStageCollection.getNamespace().getFullName().split("\\.");
    MongoClient mongoClient3 = this.getMongoClient();
    MongoDatabase newStageDB = mongoClient3.getDatabase(splitsStage[0]);
    MongoCollection<Document> stageCollectionNew = newStageDB.getCollection(splitsStage[1])
                        .withWriteConcern(WriteConcern.MAJORITY.withJournal(true))
    .withReadConcern(ReadConcern.MAJORITY);

    logger.info("mongoStageCollection.getWriteConcern(): {} ", mongoStageCollection.getWriteConcern());
    logger.info("mongoStageCollection.getReadConcern(): {} ",
      mongoStageCollection.getReadConcern().toString());
    logger.info("mongoStageCollection.getReadPreference(): {}",
                        mongoStageCollection.getReadPreference().getName());

    try {
          BulkWriteResult bulkWriteResult = stageCollectionNew.bulkWrite(listDoc, bulkWriteOptions);

          logger.info("bulkWriteResult inserted count in STAGING: " + bulkWriteResult.getInsertedCount());
          logger.info("bulkWriteResult modified count  in STAGING: " + bulkWriteResult.getModifiedCount());
           logger.info("bulkWriteResult matched count in STAGING: " + bulkWriteResult.getMatchedCount());
           logger.info("bulkWriteResult deleted count in STAGING: " + bulkWriteResult.getDeletedCount());
           logger.info("bulkWriteResult upserted count in STAGING: " + bulkWriteResult.getUpserts().size());
           logger.info("bulkWriteResult was acknowledged in STAGING: " + bulkWriteResult.wasAcknowledged());
          mongoClient3.close();
                } catch (Exception e) {
                    logger.warn("Error in bulkWriting STAGING DB: {} ", e.getMessage());
                    logger.error(e.getMessage(), e);
                }

例如 2个DB是FHIR和FHIR_Stage。 在两个数据库中都创建了相同的集合。 FHIR.Condition和FHIR_STAGE.Condition

FHIR.Observation和FHIR_STAGE.Observation

以此类推...

FHIR应该具有所有数据,而FHIR_Stage应该仅具有增量数据。 但是,在初始加载中,两个数据库都应包含完全相同的数据。

我看到的是这两个数据库中的集合计数不匹配 即FHIR.Condition中的计数与FHIR_STAGE.Condition中的计数不同

这里的问题是这种不匹配是随机发生的,即有时不匹配,有时不匹配(当我清理所有内容并重新运行初始负载时) 在这两个数据库中的不同集合中会发生这种情况。 而且它没有模式,随机地会有一些收集计数不匹配,有时一切都匹配。

我已经有一个星期无法解决这个问题了。 任何帮助将不胜感激。

MongoDB设置:

我们有一个3节点(VM)集群。我们有3个分片正在运行,每个分片都是3个成员副本集。每个节点都是其中一个副本集的主节点。

使用x509证书保护群集。

我在sh.status()或rs.status()中都没有看到错误。 也没有复制延迟。

根据某些业务逻辑,从Java代码动态创建数据库和集合。而且,我还将在数据库上启用分片,然后在代码中启用分片。

WriteConcern-多数

ReadPreference-Primary

ReadConcern-多数

Mongo版本:3.4.15 Mongo Java驱动程序:3.4.2

仅供参考-相同的代码库可以在独立的MongoDB上正常工作。

感谢您的期待。

如有需要,我很乐意分享更多信息。

P.S。

如果有什么不同,写入MongoDB的进程就是Kafka使用者

1 个答案:

答案 0 :(得分:0)

我们在发布此消息几天后发现了问题-

我们的分片式MongoDB集群。

这是因为我们没有使用聚合管道中的count()函数,而是依赖db.collectionName.count()

转到聚合管道,我们可以在两个数据库中看到相同的文档。

Reference指出来。