通过弹簧数据迭代MongoDB中的大型集合

2022-09-01 10:16:58

朋友!

我正在通过spring-data在java项目中使用MongoDB。我使用存储库接口来访问集合中的数据。对于某些处理,我需要迭代集合的所有元素。我可以使用petchAll的存储库方法,但它总是返回ArrayList。

但是,假设其中一个集合会很大 - 每个集合最多100万条记录,每个记录至少几千字节。我想我不应该在这种情况下使用fetchAll,但我既找不到返回一些迭代器的方便方法(这可能允许部分获取集合),也找不到带有回调的方便方法。

我只看到支持在页面中检索此类集合。我想知道这是否是处理此类集合的唯一方法?


答案 1

反应迟钝,但也许将来会帮助某人。Spring data不提供任何API来包装Mongo DB Cursor功能。它在方法中使用它,但始终返回完整的对象列表。选项是直接使用Mongo API或使用Spring Data分页API,如下所示:find

        final int pageLimit = 300;
        int pageNumber = 0;
        Page<T> page = repository.findAll(new PageRequest(pageNumber, pageLimit));
        while (page.hasNextPage()) {
            processPageContent(page.getContent());
            page = repository.findAll(new PageRequest(++pageNumber, pageLimit));
        }
        // process last page
        processPageContent(page.getContent());

UPD (!对于大型数据集,此方法是不够的(请参阅@Shawn布什评论)在这种情况下,请直接使用Mongo API。


答案 2

由于这个问题最近被撞了,这个答案需要更多的爱!

如果您使用Spring Data Repository接口,则可以声明一个返回Stream的自定义方法,它将由Spring Data使用游标实现:

import java.util.Stream;

public interface AlarmRepository extends CrudRepository<Alarm, String> {

    Stream<Alarm> findAllBy();

}

因此,对于大量数据,您可以流式传输它们并在没有内存限制的情况下逐行处理。

查看 https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongodb.repositories.queries