Docs Menu
Docs Home
/ / /
Java 동기화
/ / /

커서에서 데이터 액세스

이 페이지의 내용

  • 개요
  • 터미널 메서드
  • First
  • 결과 수
  • 으로
  • 커서
  • 설명합니다.
  • 사용 패턴
  • 함수 반복
  • 조건부 반복
  • 커서 정리
  • 닫기
  • 리소스 문으로 시도

이 가이드에서는 MongoDB Java 드라이버에서 커서 를 사용하여 데이터에 액세스하는 방법을 배울 수 있습니다.

커서는 애플리케이션이 주어진 시간에 데이터베이스 결과의 하위 집합만 메모리에 유지하면서 데이터베이스 결과를 반복할 수 있는 메커니즘입니다. 드라이버는 여러 문서와 일치하는 읽기 작업에서 커서를 사용하여 일치하는 문서를 한 번에 모두 반환하는 대신 일괄적으로 반환합니다.

이 페이지에서는find() 시작 메서드를 사용하여 FindIterable에서 데이터에 액세스하는 방법을 보여 줍니다.

참고

데이터에 액세스하고 저장하는 다음 방법은 AggregateIterable과 같은 다른 이터러블에도 적용됩니다.

find() 메서드는 FindIterable 인스턴스를 만들고 반환합니다. FindIterable 를 사용하면 Atlas Search 기준과 일치하는 문서를 찾아보고 메서드를 통해 매개변수를 설정하여 표시할 문서를 추가로 지정할 수 있습니다.

터미널 메서드는 작업을 제어하는 Iterable 인스턴스의 모든 매개변수를 구성한 후 MongoDB 배포서버에서 작업을 실행합니다.

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() 메서드를 사용하여 쿼리 결과를 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" }

explain 작업에 대한 자세한 내용은 다음 서버 매뉴얼 항목을 참조하세요.

  • 설명 출력

  • 쿼리 계획

이 섹션에 언급된 메서드 및 클래스에 대한 자세한 내용은 다음 API 문서를 참조하세요.

MongoCursorFindIterable 를 사용하면 네트워크 및 캐싱 로직을 추상화하여 한 번에 한 문서씩 쿼리 결과에 액세스할 수 있습니다.

FindIterableforEach() 메서드에 함수를 전달하여 기능적 스타일로 결과를 반복합니다.

FindIterable<Document> iterable = collection.find();
iterable.forEach(doc -> System.out.println(doc.toJson()));

중요

시작 메서드는 반복자 메서드를 사용하여 반복할 수 있는 Iterable 인터페이스를 구현하는 객체를 반환합니다. 경우에 따라 향상된 foreach 루프를 사용하여 결과를 반복합니다.

for (Document cur : 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 문서를 참조하세요.

돌아가기

Retrieve Data