簡體   English   中英

Spring 數據 MongoDB - 使用 Pageable 查找數百萬個數據 - Memory 過載?

[英]Spring Data MongoDB - Find millions of data with Pageable - Memory overload?

我正在使用 Spring 數據 MongoDB 並且我有這個簡單的存儲庫:

@Repository
public interface TracksRepository extends MongoRepository<Track, String> {

}

我正在使用Pageable來獲取我的曲目,比如tracksRepository.findAll(PageRequest.of(0,100))

例如,如果我有 1 億首曲目,會發生什么?

它們都會被加載到 memory 中(可能會破壞我的服務器)以便它們被分頁嗎?

我問這個是因為我看到 SpringDataMongo 在內部使用了這個代碼

@Override
public <S extends T> Page<S> findAll(final Example<S> example, Pageable pageable) {

    Assert.notNull(example, "Sample must not be null!");
    Assert.notNull(pageable, "Pageable must not be null!");

    Query q = new Query(new Criteria().alike(example)).with(pageable);
    List<S> list = mongoOperations.find(q, example.getProbeType(), entityInformation.getCollectionName());

    return PageableExecutionUtils.getPage(list, pageable,
            () -> mongoOperations.count(q, example.getProbeType(), entityInformation.getCollectionName()));
}

這表明list首先填充了結果,然后進行了分頁?

如果為真,如何在不使服務器超載的情況下實現高效的大數據查詢(帶分頁)? 謝謝。

您誤解了代碼。

此行定義了要執行的主查詢:

Query q = new Query(new Criteria().alike(example)).with(pageable);

它已經完成了分頁的主要工作:限制結果。

以下表達式僅執行計數查詢,以計算元素的總數,但僅當無法從已查詢的結果中確定總數時才會這樣做。 如果它包含的元素少於請求的元素,則這是可能的。

PageableExecutionUtils.getPage(list, pageable,
            () -> mongoOperations.count(q, example.getProbeType(), entityInformation.getCollectionName()));

因此,在對數百萬個文檔進行分頁時,沒有理由期望任何固有的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM