MongoDB编写问题:不同的数据库对相同的文档显示不同的计数



我正在尝试在MongoDB的两个数据库中的不同集合中BulkInsert某些文档。

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个数据库为FHIR和FHIR_Stage。在两个数据库中都创建了相同的集合。FHIR.条件和FHIR_STAGE.条件

FHIR.观察和FHIR_STAGE.观察

等等…

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

我看到的是这两个DB中Collections中的计数不匹配即FHIR.条件与FHIR_STAGE.条件中的计数不同

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

我已经一个星期没法思考这个问题了。非常感谢您的帮助。

MongoDB设置:

我们有一个3节点(VM(集群。我们有3个碎片在运行,每个碎片都是一个3人的复制集。每个节点都是其中一个复制副本集的主节点。

群集使用x509证书进行保护。

我在sh.status((或rs.statuss((中都没有看到错误。也没有复制滞后。

DB和Collections是根据某些业务逻辑从Java代码中动态创建的。我还启用了对DB的分片,然后对代码中的集合进行分片。

WriteConcern-多数

ReadPreference-主要

ReadConcern-多数

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

仅供参考——在独立的MongoDB上,同样的代码库也能正常工作。

期待中的感谢。

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

p.S.

如果有什么不同的话,那么写MongoDB的过程就是一个Kafka消费者

我们在发布这篇文章几天后发现了这个问题-

我们的集群是分片的MongoDB集群。

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

转到聚合管道,我们可以在两个DB中看到相等的文档。

参考文献指出了这一点。

最新更新