java 如何使用reactive mongo模板有效地删除具有特定条件的多个文档?

cwxwcias  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(42)

问题是,下面的代码需要很长时间才能执行,我在集合中有50K文档,执行需要15秒。该函数采用epochTime并获取比filteredDate更早的文档。然后查找并删除它们。

public Mono<List<AuditLog>> archiveAuditLogs(long filteredEpochTime) {

        Query query = new Query();
        Date filteredDate = Date.from(Instant.ofEpochMilli(filteredEpochTime));
        query.addCriteria(Criteria.where("createdAt").lte(filteredDate));
        return this.mongoTemplate.findAllAndRemove(query, AuditLog.class).collectList();
        

     
}

字符串
如何优化这段代码?

zysjyyx4

zysjyyx41#

可能有很多原因导致这样糟糕的性能,50 K记录的集合大小(尽管我不知道集合的物理大小)一点也不大。
尽管如此,发出的请求是很简单的.我可以建议的事情:
1.我假设你需要AuditLog的已删除示例,因为你要返回它们。但是如果你只是需要删除记录的数量或一些关于删除的Meta信息,那么只发出这个查询而不是findAllAndRemove()就足够了。问题是findAllAndRemove()实际上触发了2个查询-一个是读取所有要删除的数据,另一个是删除读取记录。这肯定会影响您的性能,但同样,如果这是一个需求,I do not see a clear way out to return records after deletion in MongoDB,请记住它。
1.启用queries profiling一段时间。然后你可以检查一下每个查询到底花了多少时间。也许COLLSCAN影响了你的性能,你需要添加some indexes。也许这是由于主/从网络问题,我在我的生活中遇到过几次。所以基本上这些方法与你的代码库无关。
希望我能提供一些指导,祝你有一个美好的一天!

相关问题