문서 메뉴
문서 홈
/ / /
Go 드라이버
/ / /

데이터 조회

이 페이지의 내용

  • 개요
  • 샘플 데이터
  • 작업 찾기
  • 모든 문서 찾기
  • 하나의 문서 찾기
  • 동작 수정
  • 집계 작업
  • 집계
  • 동작 수정
  • 추가 정보
  • API 문서

이 가이드에서는 읽기 작업을 사용하여 MongoDB 컬렉션에서 데이터를 조회하는 방법에 대해 대해 설명합니다.

읽기 작업을 통해 다음을 수행할 수 있습니다.

  • 찾기 작업을 사용하여 컬렉션에서 문서 검색

  • 집계 작업을 사용하여 컬렉션의 문서에서 변환 수행

이 가이드의 예제에서는 다음 Tea 구조체를 tea collection의 문서 모델로 사용합니다.

type Tea struct {
Item string `bson:"item,omitempty"`
Rating int32 `bson:"rating,omitempty"`
DateOrdered time.Time `bson:"date_ordered,omitempty"`
}

이 가이드의 예시를 실행하려면 다음 스니펫을 사용하여 이러한 문서를 db 데이터베이스의 tea 컬렉션에 로드합니다.

coll := client.Database("db").Collection("tea")
docs := []interface{}{
Tea{Item: "Masala", Rating: 10, DateOrdered: time.Date(2009, 11, 17, 0, 0, 0, 0, time.Local)},
Tea{Item: "Sencha", Rating: 7, DateOrdered: time.Date(2009, 11, 18, 0, 0, 0, 0, time.Local)},
Tea{Item: "Masala", Rating: 9, DateOrdered: time.Date(2009, 11, 12, 0, 0, 0, 0, time.Local)},
Tea{Item: "Masala", Rating: 8, DateOrdered: time.Date(2009, 12, 1, 0, 0, 0, 0, time.Local)},
Tea{Item: "Sencha", Rating: 10, DateOrdered: time.Date(2009, 12, 17, 0, 0, 0, 0, time.Local)},
Tea{Item: "Hibiscus", Rating: 4, DateOrdered: time.Date(2009, 12, 18, 0, 0, 0, 0, time.Local)},
}
result, err := coll.InsertMany(context.TODO(), docs)

존재하지 않는 데이터베이스 및 collection

쓰기 작업을 수행할 때 필요한 데이터베이스 및 collection이 없는 경우 서버는 이를 암시적으로 생성합니다.

각 문서에는 고객이 주문한 차 종류, 제품의 평점, 주문 날짜가 명시되어 있습니다. 이러한 설명은 item, rating, date_ordered 필드에 해당합니다.

찾기 작업을 사용하여 MongoDB에서 데이터를 조회합니다. 찾기 작업은 Find()FindOne() 메서드로 구성됩니다.

Find() 메서드에서는 Context 유형과 쿼리 필터를 전달해야 합니다. 이 메서드는 해당 필터와 일치하는 모든 문서를 Cursor 유형으로 반환합니다.

Find() 메서드를 사용하는 예제는 이 페이지의 찾기 예제 섹션을 참조하세요. 커서를 사용하여 데이터에 액세스하는 방법을 알아보려면 커서에서 데이터 액세스 가이드를 참조하세요.

FindOne() 메서드에서는 Context 유형과 쿼리 필터를 전달해야 합니다. 이 메서드는 해당 필터와 일치하는 첫 번째 문서를 SingleResult 유형으로 반환합니다.

FindOne() 메서드를 사용하는 예시는 이 페이지에 있는 예시 찾기를 참조하세요. FindOne()(을)를 사용하고 특정 ObjectId 값을 기준으로 쿼리하는 예시를 보려면 이 페이지에 있는 ObjectId 예시로 찾기 섹션을 참조하세요.

SingleResult 유형에서 데이터에 액세스하는 방법을 알아보려면 BSON 가이드에서 언마셜링을 참조하세요.

FindOptionsFindOneOptions 유형을 전달하여 Find()FindOne()의 동작을 수정할 수 있습니다. 옵션을 지정하지 않으면 드라이버는 각 옵션에 대해 기본값을 사용합니다.

두 유형 모두에서 일반적으로 사용되는 옵션은 다음 방법을 사용하여 구성할 수 있습니다.

메서드
설명
SetCollation()
결과를 정렬할 때 사용할 언어 데이터 정렬 유형입니다.
기본값입니다: nil
SetLimit()
반환할 문서의 최대 개수입니다.
기본값입니다: 0

참고

이 옵션은 FindOneOptions에 사용할 수 없습니다. FindOne() 메서드는 내부적으로 SetLimit(-1)를 사용합니다.

SetProjection()
반환된 문서에 포함할 필드입니다.
기본값입니다: nil
SetSkip()
건너뛸 문서 수입니다.
기본값입니다: 0
SetSort()
일치하는 문서의 순서를 지정하는 정렬 유형의 필드입니다. 오름차순 또는 내림차순 정렬을 지정할 수 있습니다.
기본값: 없음

다음 예에서는 아래의 조치를 수행하는 Find() 메서드에 컨텍스트, 필터, FindOptions를 전달합니다.

  • rating 값이 59(이 값 제외) 사이인 문서를 일치시킴

  • 일치하는 문서를 오름차순으로 정렬하는 기준은 다음과 같습니다. date_ordered

filter := bson.D{
{"$and",
bson.A{
bson.D{{"rating", bson.D{{"$gt", 5}}}},
bson.D{{"rating", bson.D{{"$lt", 9}}}},
}},
}
sort := bson.D{{"date_ordered", 1}}
opts := options.Find().SetSort(sort)
// Retrieves documents that match the filter and prints them as structs
cursor, err := coll.Find(context.TODO(), filter, opts)
if err != nil {
panic(err)
}
var results []Tea
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))
}

다음 예에서는 아래의 조치를 수행하는 FindOne() 메서드에 컨텍스트, 필터, FindOneOptions를 전달합니다.

  • date_ordered 값이 2009년 11월 30일 또는 그 이전인 문서와 일치시킴

  • 일치하는 처음 2개 문서를 건너뜀

filter := bson.D{{"date_ordered", bson.D{{"$lte", time.Date(2009, 11, 30, 0, 0, 0, 0, time.Local)}}}}
opts := options.FindOne().SetSkip(2)
// Retrieves a document that matches the filter and prints it as
// a struct
var result Tea
err := coll.FindOne(context.TODO(), filter, opts).Decode(&result)
if err != nil {
if err == mongo.ErrNoDocuments {
fmt.Println("No documents found")
} else {
panic(err)
}
}
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))

이 예에서는 값이 ObjectId 유형인 id 변수를 정의하고 id를 사용하여 쿼리 필터를 지정합니다. 필터는 id 변수에 해당하는 _id 필드 값과 문서를 일치시킵니다. 이 예에서는 _id 값을 기반으로 다음 문서를 쿼리합니다.

{
_id: ObjectId('65170b42b99efdd0b07d42de'),
item: "Hibiscus",
rating : 4,
date_ordered : 2009-12-18T05:00:00.000+00:00
}

다음 코드는 필터와 FindOneOptions 인스턴스를 FindOne() 메서드에 매개 변수로 전달하여 아래의 조치를 수행합니다.

  • 지정된 ObjectId 값과 문서를 일치시킴

  • 일치하는 문서의 Item 필드와 Rating 필드만 프로젝션함

id, err := primitive.ObjectIDFromHex("65170b42b99efdd0b07d42de")
if err != nil {
panic(err)
}
// Creates a filter to match a document that has the specified
// "_id" value
filter := bson.D{{"_id", id}}
opts := options.FindOne().SetProjection(bson.D{{"item", 1}, {"rating", 1}})
// Retrieves a document that matches the filter and prints it as
// a struct
var result Tea
err = coll.FindOne(context.TODO(), filter, opts).Decode(&result)
if err != nil {
if err == mongo.ErrNoDocuments {
fmt.Println("No documents found")
} else {
panic(err)
}
}
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))

참고

Go 드라이버는 각 문서의 _id 필드에 대해 고유한 ObjectId 값을 자동으로 생성하므로 ObjectId 값은 앞에 설명한 코드 예시와 다를 수 있습니다. _id 필드에 대한 자세한 내용은 문서 삽입 페이지의 _id 필드 섹션을 참조하세요.

애그리게이션 작업을 사용하여 MongoDB에서 데이터를 조회하고 변환합니다. Aggregate() 메서드를 사용하여 애그리게이션 작업을 수행합니다.

Aggregate() 메서드에서는 Context 유형과 애그리게이션 파이프라인을 전달해야 합니다. 애그리게이션 파이프라인은 단계를 통해 데이터를 변환하는 방법을 정의합니다. 일부 단계에서는 문서 일치, 필드 이름 바꾸기, 값 그룹화 등을 수행합니다.

이 메서드는 결과 문서를 Cursor 유형으로 반환합니다. $match 단계를 생략하면 컬렉션의 모든 문서를 사용하여 파이프라인이 진행됩니다.

커서에서 데이터에 액세스하는 방법을 알아보려면 커서에서 데이터 액세스를 참조하세요.

Aggregate() 메서드는 선택적으로 AggregateOptions 유형을 사용하며, 이는 동작을 수정하는 데 사용할 수 있는 옵션입니다. 옵션을 지정하지 않으면 드라이버는 각 옵션에 대해 기본값을 사용합니다.

AggregateOptions 유형을 사용하면 다음 방법으로 옵션을 구성할 수 있습니다.

메서드
설명
SetAllowDiskUse()
임시 파일에 쓸지 여부를 지정합니다.
기본값입니다: false
SetBatchSize()
각 배치에서 반환할 문서 수입니다.
기본값: 없음
SetBypassDocumentValidation()
문서 수준 유효성 검사를 거부하는 쓰기 작업을 허용할지 여부를 지정합니다.
기본값입니다: false
SetCollation()
결과를 정렬할 때 사용할 언어 데이터 정렬 유형입니다.
기본값입니다: nil
SetMaxTime()
서버에서 쿼리를 실행할 수 있는 최대 시간입니다.
기본값입니다: nil
SetMaxAwaitTime()
서버가 테일 커서 쿼리를 충족하기 위해 새 문서를 기다리는 최대 시간입니다.
기본값입니다: nil
SetComment()
데이터베이스 프로파일러, currenTop, 로그를 통해 작업을 추적하는 데 도움이 되는 임의의 문자열입니다.
기본값입니다: ""
SetHint()
조회할 문서를 스캔할 때 사용하는 인덱스입니다.
기본값입니다: nil
SetLet()
애그리게이션 표현식의 매개 변수를 지정합니다. 그러면 쿼리 텍스트에서 변수를 분리하여 명령 가독성이 향상됩니다.
기본값: 없음

다음 예에서는 아래의 조치를 수행하는 애그리게이션 파이프라인과 컨텍스트를 전달합니다.

  • 주문한 품목별 리뷰를 그룹화함

  • 각 품목의 평균 평점을 계산함

groupStage := bson.D{
{"$group", bson.D{
{"_id", "$item"},
{"average", bson.D{
{"$avg", "$rating"},
}},
}}}
cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{groupStage})
if err != nil {
panic(err)
}
// Prints the average "rating" for each item
var results []bson.M
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Printf("%v had an average rating of %v \n", result["_id"], result["average"])
}

집계 파이프라인을 구성하는 방법을 자세히 알아보려면 집계에 대한 MongoDB 서버 매뉴얼 페이지를 참조하세요.

찾기 작업의 실행 가능한 예는 다음과 같은 사용의 예를 참조하세요.

언급된 작업에 대해 자세히 알아보려면 다음 가이드를 참조하세요.

이 가이드에서 설명하는 메서드나 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.

← 문서 수 계산