08-02-2023, 04:47 PM
Du to Mongo DB Cursor capabilities, if you have long process, you can lost cursor...
I recommend to use paging :
```
final int pageSize = 1000;
var paging = Pageable.ofSize(pageSize);
do {
Page<T> page = repository.findAll(paging); // Retrieve page items
page.forEach((item) -> this.processItem(item);); // Do item job
// page++
paging = page.nextPageable(); // If last: return Pageable.unpaged()
}
while (paging.isPaged()); // If last: Unpaged.isPaged() return false
```
And for repository, 2 options:
```
// Use Spring Data Interface
@Repository
public interface YourDao extends PagingAndSortingRepository<T, ID> {
// extends create this impl
// Page<T> findAll(Pageable pageable);
}
// Or create your own Impl
public class YourDaoImpl implements YourDao {
@Override
public Page<T> findAll(Pageable pageable) {
final var query = new Query().with(pageable);
var items = mongoTemplate.find(query, T.class);
return PageableExecutionUtils.getPage(
items,
pageable,
() -> mongoTemplate.count(Query.of(query).limit(-1).skip(-1), T.class));
}
}
```
I recommend to use paging :
```
final int pageSize = 1000;
var paging = Pageable.ofSize(pageSize);
do {
Page<T> page = repository.findAll(paging); // Retrieve page items
page.forEach((item) -> this.processItem(item);); // Do item job
// page++
paging = page.nextPageable(); // If last: return Pageable.unpaged()
}
while (paging.isPaged()); // If last: Unpaged.isPaged() return false
```
And for repository, 2 options:
```
// Use Spring Data Interface
@Repository
public interface YourDao extends PagingAndSortingRepository<T, ID> {
// extends create this impl
// Page<T> findAll(Pageable pageable);
}
// Or create your own Impl
public class YourDaoImpl implements YourDao {
@Override
public Page<T> findAll(Pageable pageable) {
final var query = new Query().with(pageable);
var items = mongoTemplate.find(query, T.class);
return PageableExecutionUtils.getPage(
items,
pageable,
() -> mongoTemplate.count(Query.of(query).limit(-1).skip(-1), T.class));
}
}
```