我正在使用Mongo Java驱动程序3.11.1和Mongo 4.2.0版进行开发。我仍在学习mongo。我的应用程序接收到数据,因此必须插入或替换现有文档,即进行更新。
截至目前,每个文档的大小为780-1000字节,每个集合可以包含300万条以上的记录。方法1:我尝试对每个文档使用findOneandreplace,并且保存数据花费了超过15分钟的时间。方法2我使用下面的方法将其更改为bulkwrite,这导致大约6-7分钟保存了20000条记录。
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字段上创建了索引,但导致性能差异小于2毫秒。-使用W1的writeConcern进行了尝试,但是性能仍然相同。
b)为什么insertMany的性能比批量写入要快。我可以理解几秒钟的差异,但是无法弄清楚insertMany需要2-3秒,批量写入需要5-7分钟的原因。
c)是否可以使用任何方法来解决这种情况。
通过在DataId字段上添加索引可以更大程度地解决此问题。以前我已经在DataId字段上创建了索引,但是在创建集合后忘记创建索引。此链接How to improve MongoDB insert performance帮助解决了问题