31

友達!

spring-data を介して Java プロジェクトで MongoDB を使用しています。コレクション内のデータにアクセスするには、Repository インターフェイスを使用します。一部の処理では、コレクションのすべての要素を反復処理する必要があります。リポジトリの fetchAll メソッドを使用できますが、常に ArrayList を返します。

ただし、コレクションの 1 つが大規模であると想定されています。最大 100 万件のレコードで、少なくともそれぞれ数キロバイトです。このような場合は fetchAll を使用すべきではないと思いますが、イテレータを返す便利なメソッド (コレクションを部分的にフェッチできる可能性があります) も、コールバックを使用する便利なメソッドも見つかりませんでした。

ページでそのようなコレクションを取得するためのサポートのみを見てきました。そのようなコレクションを操作する唯一の方法なのだろうか?

4

9 に答える 9

28

遅い応答ですが、将来誰かを助けるかもしれません。Spring データは、 Mongo DB Cursor機能をラップする API を提供しません。メソッド内で使用しますfindが、常にオブジェクトの完全なリストを返します。オプションは、Mongo API を直接使用するか、Spring Data Paging APIを使用するか、次のようになります。

        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 Bush のコメントを参照) そのような場合には、Mongo API を直接使用してください。

于 2012-08-30T16:58:47.000 に答える
12

mongoTemplate を使用して Collection にアクセスし、単純に DBCursor を使用できます。

     DBCollection collection = mongoTemplate.getCollection("boundary");
     DBCursor cursor = collection.find();        
     while(cursor.hasNext()){
         DBObject obj = cursor.next();
         Object object =  obj.get("polygons");
         ..
      ...
     }
于 2016-05-01T13:55:27.747 に答える
4

別の方法:

do{
  page = repository.findAll(new PageRequest(pageNumber, pageLimit));
  pageNumber++;

}while (!page.isLastPage());
于 2014-03-28T11:34:07.407 に答える
0

この回答は、 https ://stackoverflow.com/a/22711715/5622596 に基づいています。

PageRequestその答えは、構築方法が変更されたため、少し更新する必要があります。

そうは言っても、ここに私の修正された応答があります:

int pageNumber = 1;

//Change value to whatever size you want the page to have
int pageLimit = 100;

Page<SomeClass> page;
List<SomeClass> compondList= new LinkedList<>();

do{
    PageRequest pageRequest = PageRequest.of(pageNumber, pageLimit);
    
    page = repository.findAll(pageRequest);
    
    List<SomeClass> listFromPage = page.getContent();

    //Do something with this list example below
    compondList.addAll(listFromPage);

    pageNumber++;

  }while (!page.isLast());

//Do something with the compondList: example below
return compondList;

于 2021-12-16T14:25:21.953 に答える