문서 메뉴

문서 홈애플리케이션 개발MongoDB 드라이버Go 드라이버

커서에서 데이터 액세스

이 페이지의 내용

  • 개요
  • 샘플 커서
  • 문서 개별 조회
  • 사용 가능한 커서
  • 모든 문서 검색
  • 커서 닫기
  • 추가 정보
  • API 문서

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

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

각 섹션은 컬렉션의 모든 문서를 포함하는 Cursor 구조체인 다음 cursor 변수를 사용합니다.

cursor, err := coll.Find(context.TODO(), bson.D{})
if err != nil {
panic(err)
}

이 가이드의 예제에서 드라이버는 cursor 변수에 보관된 문서를 샘플 MyStruct 구조체로 역정렬화합니다.

중요

커서가 goroutine 이 아닙니다. 안전합니다. 동시에 여러 goroutine에서 동일한 커서를 사용하지 마십시오.

현재 고루틴(goroutine)을 차단하면서 커서에서 문서를 개별적으로 조회하려면 Next() 메서드를 사용하세요.

이 메서드는 다음 조건이 모두 충족되는 경우 문서를 반환합니다.

  • 문서가 현재 사용 가능하거나 나중에 사용할 수 있습니다.

  • 드라이버가 오류를 발생시키지 않았습니다.

  • 컨텍스트가 만료되지 않았습니다.

for cursor.Next(context.TODO()) {
var result MyStruct
if err := cursor.Decode(&result); err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)
}
if err := cursor.Err(); err != nil {
log.Fatal(err)
}

테일 커서( tailable cursor)에서 문서 검색을 시도하려면 TryNext() 메서드를 사용합니다.

이 메서드는 다음 조건이 모두 충족되는 경우 문서를 반환합니다.

  • 현재 문서를 사용할 수 있습니다.

  • 드라이버가 오류를 발생시키지 않았습니다.

  • 컨텍스트가 만료되지 않았습니다.

for {
if cursor.TryNext(context.TODO()) {
var result MyStruct
if err := cursor.Decode(&result); err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)
continue
}
if err := cursor.Err(); err != nil {
log.Fatal(err)
}
if cursor.ID() == 0 {
break
}
}

모든 쿼리 결과로 배열을 채우려면 All() 메서드를 사용하세요.

var results []MyStruct
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Printf("%+v\n", result)
}

중요

메모리

쿼리에서 반환되는 문서의 수와 크기가 사용 가능한 애플리케이션 메모리를 초과하면 프로그램이 충돌합니다. 큰 결과 세트를 제외하면 커서를 반복적으로 사용해야 합니다.

애플리케이션에 더 이상 커서가 필요하지 않은 경우 Close() 방법을 사용하여 커서를 닫습니다. 이 방법을 사용하면 커서가 클라이언트 애플리케이션과 MongoDB 서버 양쪽에서 소비하는 리소스를 해제할 수 있습니다.

defer cursor.Close(context.TODO())

참고

이 가이드에서 설명하는 작업에 대해 자세히 알아보려면 다음 가이드를 참조하세요.

커서 및 해당 요소에 액세스하는 방법에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.

← 데이터 검색