Retrieve Data
개요
이 가이드에서는 읽기 작업을 사용하여 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 가이드에서 언마셜링을 참조하세요.
동작 수정
FindOptions
및 FindOneOptions
유형을 전달하여 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 참고이 옵션은 |
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
값이5
와9
(이 값 제외) 사이인 문서를 일치시킴일치하는 문서를 오름차순으로 정렬하는 기준은 다음과 같습니다.
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)) }
1개 찾기의 예시
다음 예에서는 아래의 조치를 수행하는 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로 1개 찾기의 예시
이 예에서는 값이 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() | 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"]) }
집계 파이프라인을 구성하는 방법을 자세히 알아보려면 집계에 대한 MongoDB 서버 매뉴얼 페이지를 참조하세요.
추가 정보
찾기 작업의 실행 가능한 예는 다음과 같은 사용의 예를 참조하세요.
언급된 작업에 대해 자세히 알아보려면 다음 가이드를 참조하세요.
API 문서
이 가이드에서 설명하는 메서드나 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.