커서에서 데이터 액세스
개요
이 가이드에서는 MongoDB Java 드라이버에서 커서 를 사용하여 데이터에 액세스하는 방법을 배울 수 있습니다.
커서는 애플리케이션이 주어진 시간에 데이터베이스 결과의 하위 집합만 메모리에 유지하면서 데이터베이스 결과를 반복할 수 있는 메커니즘입니다. 드라이버는 여러 문서와 일치하는 읽기 작업에서 커서를 사용하여 일치하는 문서를 한 번에 모두 반환하는 대신 일괄적으로 반환합니다.
이 페이지에서는find()
시작 메서드를 사용하여 FindIterable에서 데이터에 액세스하는 방법을 보여 줍니다.
참고
데이터에 액세스하고 저장하는 다음 방법은 AggregateIterable과 같은 다른 이터러블에도 적용됩니다.
find()
메서드는 FindIterable
인스턴스를 만들고 반환합니다. FindIterable
를 사용하면 Atlas Search 기준과 일치하는 문서를 찾아보고 메서드를 통해 매개변수를 설정하여 표시할 문서를 추가로 지정할 수 있습니다.
터미널 메서드
터미널 메서드는 작업을 제어하는 Iterable
인스턴스의 모든 매개변수를 구성한 후 MongoDB 배포서버에서 작업을 실행합니다.
First
first()
메서드를 사용하여 쿼리 결과에서 첫 번째 문서를 조회합니다.
FindIterable<Document> iterable = collection.find(); System.out.println(iterable.first());
이 방법은 고유 인덱스로 필터링할 때와 같이 쿼리 필터가 하나의 문서와 일치할 때 자주 사용됩니다.
결과 수
available()
메서드를 사용하여 차단하지 않고 로컬에 존재하는 결과 수를 검색합니다.
MongoCursor<Document> cursor = collection.find().cursor(); System.out.println(cursor.available());
애플리케이션이 커서의 모든 문서를 이미 반복했거나 커서가 닫힌 경우 이 메서드는 0
를 반환합니다.
into
into()
메서드를 사용하여 쿼리 결과를 List
에 저장합니다.
List<Document> results = new ArrayList<>(); FindIterable<Document> iterable = collection.find(); iterable.into(results); System.out.println(results);
이 메서드는 쿼리 필터가 사용 가능한 메모리에 들어갈 수 있는 적은 수의 문서를 반환할 때 자주 사용됩니다.
커서
cursor()
메서드를 사용하여 가져온 문서를 반복하고 조기 종료가 있는 경우 커서가 닫히도록 합니다.
MongoCursor<Document> cursor = collection.find().cursor();
커서가 닫히도록 하는 방법에 대한 자세한 내용은 커서 정리 섹션을 참조하세요.
설명합니다.
explain()
메서드를 사용하여 MongoDB가 작업을 실행하는 방법에 대한 정보를 볼 수 있습니다.
explain()
메서드는 실행 계획 및 성능 통계를 반환합니다. 실행 계획은 MongoDB가 작업을 완료할 수 있는 잠재적인 방법입니다. explain()
메서드는 성공적인 계획(MongoDB가 실행한 계획)과 거부된 계획을 모두 제공합니다.
explain()
메소드에 상세 수준을 전달하여 설명의 세부 정보 수준을 지정할 수 있습니다.
다음 표에는 설명 및 해당 사용 사례에 대한 모든 상세 수준이 나와 있습니다.
상세도 수준 | 사용 사례 |
---|---|
ALL_PLANS_EXECUTIONS | 쿼리를 실행하기 위해 MongoDB가 어떤 계획을 선택할지 알고 싶습니다. |
EXECUTION_STATS | 쿼리가 잘 수행되고 있는지 알고 싶습니다. |
QUERY_PLANNER | 쿼리에 문제가 있으며 문제를 진단하기 위해 가능한 한 많은 정보를 원합니다. |
다음 예제에서는 실행 계획을 생성하는 애그리게이션 단계에 대한 성공적인 계획의 JSON 표현을 출력합니다.
Document explanation = collection.find().explain(ExplainVerbosity.EXECUTION_STATS); List<String> keys = Arrays.asList("queryPlanner", "winningPlan"); System.out.println(explanation.getEmbedded(keys, Document.class).toJson());
앞의 코드 스니펫은 다음과 같은 출력을 생성합니다.
{ "stage": "COLLSCAN", "direction": "forward" }
설명 작업에 대한 자세한 내용은 다음 서버 매뉴얼 항목을 참조하세요.
이 섹션에 언급된 메서드 및 클래스에 대한 자세한 내용은 다음 API 문서를 참조하세요.
사용 패턴
MongoCursor
및 FindIterable
를 사용하면 네트워크 및 캐싱 로직을 추상화하여 한 번에 한 문서씩 쿼리 결과에 액세스할 수 있습니다.
함수 반복
FindIterable
의 forEach()
메서드에 함수를 전달하여 기능적 스타일로 결과를 반복합니다.
FindIterable<Document> iterable = collection.find(); iterable.forEach(doc -> System.out.println(doc.toJson()));
중요
시작 메서드는 반복자 메서드를 사용하여 반복할 수 있는 Iterable
인터페이스를 구현하는 객체를 반환합니다. 경우에 따라 향상된 foreach 루프를 사용하여 결과를 반복합니다.
for (Document cursor : collection.find()) { ... }
루프가 완료되기 전에 예외가 발생하면 커서가 닫히지 않으므로 이러한 방식으로 반복하는 것은 바람직하지 않습니다. MongoCursor
를 사용하면 커서 정리 섹션에 표시된 대로 커서가 닫히도록 할 수 있습니다.
조건부 반복
hasNext()
메서드를 사용하여 커서에서 사용 가능한 문서가 있는지 확인한 다음 next()
메서드를 사용하여 커서에서 사용 가능한 다음 문서를 검색합니다.
MongoCursor<Document> cursor = collection.find().cursor(); while (cursor.hasNext()){ System.out.println(cursor.next().toJson()); }
이 섹션에 언급된 메서드 및 클래스에 대한 자세한 내용은 다음 API 문서를 참조하세요.
커서 정리
닫기
finally
블록에서 close()
메서드를 사용하여 클라이언트 애플리케이션과 MongoDB deployment 모두에서 커서의 리소스 소비를 확보합니다.
MongoCursor<Document> cursor = collection.find().cursor(); try { while (cursor.hasNext()){ System.out.println(cursor.next().toJson()); } } finally { cursor.close(); }
리소스 문으로 시도
try-with-resources 문을 사용하여 클라이언트 애플리케이션과 MongoDB deployment 모두에서 커서의 리소스 소비를 자동으로 확보할 수 있습니다.
try(MongoCursor<Document> cursor = collection.find().cursor()) { while (cursor.hasNext()){ System.out.println(cursor.next().toJson()); } }
이 섹션에 언급된 메서드 및 클래스에 대한 자세한 내용은 다음 API 문서를 참조하세요.