개요
이 가이드 에서는 다음 메서드를 사용하여 읽기 작업에서 반환할 문서를 지정하는 방법을 학습 수 있습니다.
SetSort()
: 반환된 문서의 정렬 순서를 지정합니다.SetSkip()
: 쿼리 결과를 반환하기 전에 건너뛸 문서 수를 지정합니다.SetLimit()
: 쿼리에서 반환할 최대 문서 수를 지정합니다.
샘플 데이터
이 가이드의 예시에서는 courses
collection의 문서에 대한 모델로 다음 Course
구조체를 사용합니다.
type Course struct { Title string Enrollment int32 }
이 가이드 의 예제를 실행 하려면 다음 스니펫을 사용하여 샘플 데이터를 db.courses
컬렉션 에 로드합니다.
coll := client.Database("db").Collection("courses") docs := []interface{}{ Course{Title: "World Fiction", Enrollment: 35}, Course{Title: "Abstract Algebra", Enrollment: 60}, Course{Title: "Modern Poetry", Enrollment: 12}, Course{Title: "Plate Tectonics", Enrollment: 35}, } result, err := coll.InsertMany(context.TODO(), docs)
팁
존재하지 않는 데이터베이스 및 collection
쓰기 작업을 수행할 때 필요한 데이터베이스 및 collection이 없는 경우 서버는 이를 암시적으로 생성합니다.
각 문서 대학 과정에 대한 설명을 나타내며 각 문서 의 title
및 enrollment
필드에 해당하는 과정 제목과 최대 등록 수를 포함합니다.
Sort
결과의 순서를 지정하려면 정렬 필드와 방향을 지정하는 인터페이스를 작업 옵션의 SetSort()
메서드에 전달합니다.
다음 작업에서는 SetSort()
을 옵션으로 사용합니다.
Find()
FindOne()
FindOneAndDelete()
FindOneAndUpdate()
FindOneAndReplace()
GridFSBucket.Find()
오름차순 또는 내림차순 정렬 방향을 설정할 수 있습니다.
오름차순
오름차순 정렬은 결과가 가장 작은 순서에서 가장 큰 순서로 정렬됩니다. 오름차순 정렬을 지정하려면 정렬하려는 필드와 1
을 SetSort()
메서드에 전달합니다.
팁
오름차순 정렬을 사용하면 메서드가 Boolean
유형 값을 false
에서 true
로, String
유형 값은 a에서 z로, 숫자 유형 값은 음의 무한대부터 양의 무한대까지 정렬합니다.
다음 예에서는 enrollment
필드에 오름차순 정렬을 지정합니다.
filter := bson.D{} opts := options.Find().SetSort(bson.D{{"enrollment", 1}}) cursor, err := coll.Find(context.TODO(), filter, opts) var results []Course 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)) }
{"title":"Modern Poetry","enrollment":12} {"title":"World Fiction","enrollment":35} {"title":"Plate Tectonics","enrollment":35} {"title":"Abstract Algebra","enrollment":60}
내림차순
내림차순 정렬은 결과가 가장 큰 순서에서 가장 작은 순서로 정렬됩니다. 내림차순 정렬을 지정하려면 정렬하려는 필드와 -1
을 SetSort()
메서드에 전달합니다.
팁
내림차순 정렬을 사용하면 이 메서드는 Boolean
유형 값은 true
에서 false
로, String
유형 값은 z에서 a로, 숫자 유형 값은 양수 무한대에서 음수 무한대로 정렬합니다.
다음 예에서는 enrollment
필드에 내림차순 정렬을 지정합니다:
filter := bson.D{} opts := options.Find().SetSort(bson.D{{"enrollment", -1}}) cursor, err := coll.Find(context.TODO(), filter, opts) var results []Course 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)) }
{"title":"Abstract Algebra","enrollment":60} {"title":"World Fiction","enrollment":35} {"title":"Plate Tectonics","enrollment":35} {"title":"Modern Poetry","enrollment":12}
타이 처리
결과를 정렬하는 데 사용하는 필드에 둘 이상의 문서에 동일한 값이 있는 경우 타이가 발생합니다. MongoDB는 타이가 발생할 경우 순서를 보장하지 않습니다.
예를 들어 샘플 데이터에서는 다음 문서에서 enrollment
에 대해 타이가 발생했습니다:
{"title":"World Fiction","enrollment":35} {"title":"Plate Tectonics","enrollment":35}
추가 필드를 정렬하여 원래 정렬의 타이를 해결할 수 있습니다. 문서에 대한 특정 순서를 보장하려면 동률이 발생하지 않는 정렬 필드를 선택합니다.
다음 예에서는 enrollment
필드에 내림차순 정렬을 지정한 다음 title
필드에 오름차순 정렬을 지정합니다.
filter := bson.D{} opts := options.Find().SetSort(bson.D{{"enrollment", -1}, {"title", 1}}) cursor, err := coll.Find(context.TODO(), filter, opts) var results []Course 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)) }
{"title":"Abstract Algebra","enrollment":60} {"title":"Plate Tectonics","enrollment":35} {"title":"World Fiction","enrollment":35} {"title":"Modern Poetry","enrollment":12}
집계
집계 파이프라인에 정렬을 지정하는 $sort 단계를 포함할 수도 있습니다.
다음 예에서는 enrollment
필드에 내림차순 정렬을 지정한 다음 title
필드에 오름차순 정렬을 지정합니다.
sortStage := bson.D{{"$sort", bson.D{{"enrollment", -1}, {"title", 1}}}} cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{sortStage}) if err != nil { panic(err) } var results []Course 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)) }
{"title":"Abstract Algebra","enrollment":60} {"title":"Plate Tectonics","enrollment":35} {"title":"World Fiction","enrollment":35} {"title":"Modern Poetry","enrollment":12}
Skip
쿼리에서 반환된 지정된 수의 결과를 건너뛰려면 건너뛰려는 문서 수를 읽기 작업 옵션의 SetSkip()
메서드에 전달하세요.
다음 읽기 작업은 SetSkip()
을 옵션으로 사용합니다.
Find()
FindOne()
CountDocuments()
GridFSBucket.Find()
문서가 쿼리와 일치하는 문서 수를 초과하는 경우 해당 쿼리는 문서를 반환하지 않습니다.
찾기 작업은 어떤 필드에서도 정렬되지 않은 저장 순서로 문서를 반환합니다. 임의의 문서를 건너뛰는 것을 방지하려면 건너뛰기 옵션을 설정하기 전에 SetSort()
메서드를 사용하여 고유 값이 있는 필드에서 문서를 정렬합니다.
다음 예시에서는 다음과 같은 동작으로 Find()
작업을 수행합니다.
enrollment
필드에서 결과를 오름차순으로 정렬합니다.처음 두 문서를 건너뜁니다.
opts := options.Find().SetSort(bson.D{{"enrollment", 1}}).SetSkip(2) cursor, err := coll.Find(context.TODO(), bson.D{}, opts) var results []Course 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)) }
{"title":"Plate Tectonics","enrollment":35} {"title":"Abstract Algebra","enrollment":60}
집계
집계 파이프라인에서 문서를 건너뛰는 $skip 단계를 포함할 수도 있습니다.
다음 예시에서는 다음과 같은 동작으로 Aggregate()
작업을 수행합니다.
enrollment
필드에서 결과를 내림차순으로 정렬합니다.첫 번째 문서 건너뛰기
sortStage := bson.D{{"$sort", bson.D{{"enrollment", -1}}}} skipStage := bson.D{{"$skip", 1}} cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{sortStage, skipStage}) if err != nil { panic(err) } var results []Course 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)) }
{"title":"Plate Tectonics","enrollment":35} {"title":"World Fiction","enrollment":35} {"title":"Modern Poetry","enrollment":12}
Limit
쿼리에서 반환되는 문서 수를 제한하려면 반환하려는 문서 수를 읽기 작업 옵션의 SetLimit()
메서드에 전달하세요.
다음 읽기 작업은 SetLimit()
을 옵션으로 사용합니다.
Find()
CountDocuments()
GridFSBucket.Find()
제한이 0
이거나 일치하는 문서 수를 초과하는 경우 메서드는 모든 문서를 반환합니다. 제한이 음수인 경우 메서드는 음수의 절댓값을 한도로 간주해 문서를 검색한 후 커서를 닫습니다.
다음 예시에서는 enrollment
필드 값이 20보다 큰 두 문서를 반환하는 방법을 보여 줍니다.
filter := bson.D{{"enrollment", bson.D{{"$gt", 20}}}} opts := options.Find().SetLimit(2) cursor, err := coll.Find(context.TODO(), filter, opts) var results []Course 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)) }
{"title":"World Fiction","enrollment":35} {"title":"Abstract Algebra","enrollment":60}
다양한 옵션
운전자 다른 옵션을 설정하다 순서에 관계없이 마지막으로 제한 동작을 수행합니다. 예시 들어 SetLimit()
이(가) 호출되는 순서에 관계없이 다음 옵션 구성은 동일한 결과를 생성합니다.
opts := options.Find().SetSort(bson.D{{"enrollment", -1}}).SetSkip(1).SetLimit(2) opts := options.Find().SetLimit(2).SetSort(bson.D{{"enrollment", -1}}).SetSkip(1)
다음 예시에서는 다음과 같은 동작으로 Find()
작업을 수행합니다.
enrollment
필드에서 결과를 내림차순으로 정렬합니다.첫 번째 문서 건너뛰기
나머지 문서 중 처음 두 개를 반환합니다.
filter := bson.D{} opts := options.Find().SetSort(bson.D{{"enrollment", -1}}).SetLimit(2).SetSkip(1) cursor, err := coll.Find(context.TODO(), filter, opts) var results []Course 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)) }
{"title":"Abstract Algebra","enrollment":60} {"title":"Plate Tectonics","enrollment":35}
집계
집계 파이프라인에 한도를 지정하는 $limit 단계를 포함할 수도 있습니다.
다음 예시에서는 세 개의 문서를 반환하는 방법을 보여 줍니다.
limitStage := bson.D{{"$limit", 3}} cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{limitStage}) if err != nil { panic(err) } var results []Course 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)) }
{"title":"World Fiction","enrollment":35} {"title":"Abstract Algebra","enrollment":60} {"title":"Modern Poetry","enrollment":12}
추가 정보
이 가이드 에 설명된 작업에 대해 자세히 학습 다음 문서를 참조하세요.
텍스트 검색에서 텍스트 점수를 정렬하는 방법을 학습하려면 텍스트 검색 수행하기를 참조하세요.
API 문서
이 가이드에서 설명하는 메서드나 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.