【发布时间】:2019-11-26 09:26:54
【问题描述】:
我正在使用 Mongo java driver 3.11.1 和 Mongo Version 4.2.0 进行开发。我还在学习 mongo。我的应用程序接收数据并且必须插入或替换现有文档,即执行 upsert。
截至目前,每个文档的大小为 780-1000 字节,每个集合可以有超过 300 万条记录。 方法 1:我尝试对每个文档使用 findOneandreplace,保存数据的时间超过 15 分钟。 方法 2 我使用下面的方法将其更改为 bulkwrite,这导致保存 20000 条记录大约需要 6-7 分钟。
List<Data> dataList;
dataList.forEach(data-> {
Document updatedDocument = new Document(data.getFields());
updates.add(new ReplaceOneModel(eq("DataId", data.getId()), updatedDocument, updateOptions));
});
final BulkWriteResult bulkWriteResult = mongoCollection.bulkWrite(updates);
3) 我尝试使用 collection.insertMany,它需要 2 秒来存储数据。 根据驱动程序代码,insertMany 也在内部 InsertMany 使用 MixedBulkWriteOperation 来插入类似于 bulkWrite 的数据。
我的查询是 -
a) 我必须进行 upsert 操作,请让我知道我在哪里做错了。 - 在 DataId 字段上创建索引,但在性能方面导致
b) 为什么 insertMany 的性能比批量写入快。我可以理解几秒钟的差异,但无法弄清楚 insertMany 2-3 秒和 bulkwrite 5-7 分钟的原因。
c) 有什么方法可以用来解决这种情况。
【问题讨论】:
标签: mongodb performance upsert mongo-java mongo-java-driver