본문 바로가기
개발아닌개발/mongoDB

springboot Mongodb 데이터 필터 후 갯수 제한하여 List에 담기

by 불청객 2021. 12. 30.
반응형

Spring Tool Suite 4

 

 

Mongodb에서 최신데이터만 10건 추출하여 가져오기를 수행하려 한다.

Page로 가져오기랑 List로 가져오기 두 방법이 있던데

 

Page로 데이터를 담아올경우, 사용하지 않는 데이터가 많고 추출하기도 번잡스러워 한번에 List로 함.

Repository에 간단히 @Query를 사용하는게 습관된지라 간단간단 쉽게쉽게 지향! 

 

 

 

 

List 로 데이터 가져오기

Repository

  • @Query로 최신데이터만 가져오도록 _id : -1 작성 (-1 : 마지막부터, 1: 처음부터)
  • Pageable은 대용량의 Mongodb를 다 가져오는 멍청이가 되지 않도록, 가져오는 데이터 수를 제한하기 위함
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;


@Repository
public interface MonitorExternalRepo extends MongoRepository<MonitorExternal, String>{

	@Query(sort = "{_id:-1}")
	List<MonitorExternal> findBy(Pageable pageable);
}

Service

  • 서비스해줄 Class에는 작성한 쿼리를 갖고 있는 Repository를 멤버변수로 추가하고 다음 코드를 작성한다.

<TMI> new PageRequst(0,10) 은 더이상 사용이 안되므로 대신에 아래 코드처럼 PageRequest.of(0,10)을 써줘야함

 

	public List<MonitorExternal> findAll() {
		return monitorExternalRepo.findBy(PageRequest.of(0, 10));
	}

 

 

간단한 테스트를 위해서 RestController에 테스트용 API 하나 만들어서 return 해보면 확인가능

	@RequestMapping(value = "/temp", method = RequestMethod.GET)
	public List<MonitorExternal> findreturn(){
		return adminService.findAll();
	}

 

 

 

 

번외. Page 로 데이터 가져오기

- 별다른 Repository 작업 X

Service

public Page<MonitorExternal> findAllPage() {
	Pageable pageable = PageRequest.of(0, 10);
	Query query = new Query();
	query.with(Sort.by(Sort.Direction.DESC, "_id"));
	query.with(pageable);
	
	List<MonitorExternal> list = mongoTemplate.find(query, MonitorExternal.class);
	
	return PageableExecutionUtils.getPage(
			list,
			pageable,
			() -> mongoTemplate.count(new Query().limit(10).skip(-1), MonitorExternal.class));
}

 

 

간단한 테스트를 위해서 RestController에 테스트용 API 하나 만들어서 return 해보면 확인가능

	@RequestMapping(value = "/temp2", method = RequestMethod.GET)
	public Page<MonitorExternal> findreturn2(){
		return adminService.findAllPage();
	}
728x90
반응형

댓글