Docs Menu
Docs Home
/ / /
Go 드라이버
/ / /

Retrieve Data

이 페이지의 내용

  • 개요
  • 샘플 데이터
  • 작업 찾기
  • 모든 문서 찾기
  • 하나의 문서 찾기
  • 동작 수정
  • 집계 작업
  • 집계
  • 동작 수정
  • 추가 정보
  • 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()
The type of language collation to use when sorting results.
Default: nil
SetLimit()
The maximum number of documents to return.
Default: 0
This option is not available for FindOneOptions. The FindOne() method internally uses SetLimit(-1).
SetProjection()
The fields to include in the returned documents.
Default: nil
SetSkip()
The number of documents to skip.
Default: 0
SetSort()
The field and type of sort to order the matched documents. You can specify an ascending or descending sort.
Default: none

다음 예에서는 아래의 조치를 수행하는 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))
}
{"item":"Sencha","rating":7,"date_ordered":"2009-11-18T05:00:00Z"}
{"item":"Masala","rating":8,"date_ordered":"2009-12-01T05:00:00Z"}

다음 예에서는 아래의 조치를 수행하는 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))
{"item":"Masala","rating":9,"date_ordered":"2009-11-12T05:00:00Z"}

이 예에서는 값이 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))
{"item":"Hibiscus","rating":4}

참고

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

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

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

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

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

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

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

메서드
설명
SetAllowDiskUse()
Whether to write to temporary files.
Default: false
SetBatchSize()
The number of documents to return in each batch.
Default: none
SetBypassDocumentValidation()
Whether to allow the write to opt-out of document level validation.
Default: false
SetCollation()
The type of language collation to use when sorting results.
Default: nil
SetMaxTime()
The maximum amount of time that the query can run on the server.
Default: nil
SetMaxAwaitTime()
The maximum amount of time for the server to wait on new documents to satisfy a tailable cursor query.
Default: nil
SetComment()
An arbitrary string to help trace the operation through the database profiler, currentOp and logs.
Default: ""
SetHint()
The index to use to scan for documents to retrieve.
Default: nil
SetLet()
Specifies parameters for the aggregate expression, which improves command readability by separating the variables from the query text.
Default: none

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

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

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

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"])
}
Sencha had an average rating of 8.5
Hibiscus had an average rating of 4
Masala had an average rating of 9

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

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

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

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

돌아가기

문서 수 계산