如何解决Mongo upsert 性能问题
我想上传一个文件 (csv/xlsx) 并将其内容存储在 MongoDB 集合中,该集合基于选择为唯一键的某些字段。 下面提到的文件中的示例我将 Item 和 Date Of Purchase 列作为组合唯一键 |项目 |价格 |购买日期| |:------:|:-----:|:--------------:| |足球|100 |01-01-2000| |头盔 |200 |02-01-2000| |背包|100 |03-01-2000| |PS 5 |5000 |05-01-2000|
在将数据保存在集合中时,我必须根据这些键进行更新。 以前的逻辑:
List<WriteModel<Document>> records;
……
processMehtod(Object [] row) {
Document record; //Consists of one row {“item” : “Football”,“price”:”100”,“DateOfPurchase” :” 01-01-2000”}
Document uniqueObject; //Consists of Unique fields {“item” : “Football”,“DateOfPurchase” :” 01-01-2000”}
…..
Document doc = new Document("$set",record);
records.add(new UpdateOneModel<Document>(uniqueObject,doc,new UpdateOptions().upsert(true)));
}
batchProcess (){
dbcollection.bulkWrite(records);
}
现在,想要上传的excel文件有这样90K的唯一行,现有的集合有近100K的记录,将来会增加。上述方法需要一个多小时来处理。 因此,我们决定进行批量插入然后删除(基于数据版本),而不是 upsert。 对于删除,我使用 DeleteOneModel 过滤器 {“item” : “Football”,“DateOfPurchase” :” 01-01-2000”,“version”: 小于当前版本} 使用这种方法以及删除一批 1000 条记录需要 1 分钟以上的时间。
最后,为了删除,我使用了for-join pool,在插入所有记录后,最后一个一个地删除了记录。这将时间减少到近 10 分钟。 有没有更好的方法来实现这一点,因为这在未来集合大小可以达到超过一百万条记录,性能将再次下降
注意:字段不是常量,因此无法根据这些字段执行索引。索引是在 user_id 字段上完成的,该字段与每个文档一起存储
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。