Overview
このガイドでは、次のメソッドを使用して、読み取り操作から返されるドキュメントを指定する方法を学習できます。
SetSort()
: 返されるドキュメントのソート順序を指定します。SetSkip()
: クエリ結果を返す前にスキップするドキュメントの数を指定します。SetLimit()
: クエリから返されるドキュメントの最大数を指定します。
サンプル データ
このガイドの例では、 courses
コレクション内のドキュメントのモデルとして次の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)
Tip
存在しないデータベースとコレクション
書き込み操作を実行するときに必要なデータベースとコレクションが存在しない場合は、サーバーが暗黙的にそれらを作成します。
各ドキュメントは大学コースの説明を表し、各ドキュメントの title
フィールドと enrollment
フィールドに対応するコース名と最大登録者数を含みます。
Sort
結果の順序を指定するには、操作のオプションの SetSort()
メソッドに並べ替えフィールドと方向を指定するインターフェースを渡します。
次の操作では、オプションとして SetSort()
が使用されます。
Find()
FindOne()
FindOneAndDelete()
FindOneAndUpdate()
FindOneAndReplace()
GridFSBucket.Find()
昇順 または 降順 の並べ替え方向を設定できます。
上昇
昇順で並べ替えると、結果が最小から最大の順に並べられます。この並べ替えを指定するには、並べ替えるフィールドと 1
を SetSort()
メソッドに渡します。
Tip
昇順ソートでは、このメソッドは、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()
メソッドに渡します。
Tip
降順ソートでは、メソッドは、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}
同点の扱い
結果を並べ替えるために使用しているフィールドで 2 つ以上のドキュメントが同じ値を持つ場合、同順位となります。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}
スキップ
クエリから返された結果の指定した数をスキップするには、スキップするドキュメント数を読み取り操作のオプションのSetSkip()
メソッドに渡します。
次の読み取り操作では、オプションとして SetSkip()
が使用されます。
Find()
FindOne()
CountDocuments()
GridFSBucket.Find()
ドキュメントの数がクエリに一致するドキュメントの数を超える場合、そのクエリはドキュメントを返しません。
検索操作では、フィールドでソートされていない自然な順序でドキュメントが返されます。 無作為なドキュメントのスキップを回避するには、スキップ オプションを設定する前に、 SetSort()
メソッドを使用して一意の値を持つフィールドでドキュメントをソートします。
次の例では、次の動作でFind()
操作を実行します。
enrollment
フィールドの昇順で結果をソートします最初の 2 つのドキュメントをスキップします
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 より大きい 2 つのドキュメントを返す方法を示しています。
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
フィールドの降順で結果を並べ替えます最初のドキュメントをスキップします
残りのドキュメントの最初の 2 つのドキュメントを返します
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ステージを含めることもできます。
次の例では、3 つのドキュメントを返す方法を示しています。
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 ドキュメントを参照してください。