結果を並べ替える
Overview
このガイドでは、操作の結果の順序を指定する方法を学習できます。
サンプル データ
このガイドの例では、 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
フィールドに対応する、コース名と最大登録者数を含む大学コースの説明が含まれています。
並べ替えの方向
結果の順序を指定するには、操作のオプションの SetSort()
メソッドに並べ替えフィールドと方向を指定するインターフェースを渡します。
次の操作は、オプションをパラメーターとして受け取ります。
Find()
FindOne()
FindOneAndDelete()
FindOneAndUpdate()
FindOneAndReplace()
gridfs.Bucket.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}
詳細情報
上記で説明されている操作の詳細については、次のガイドを参照してください。
テキスト検索からのテキスト スコアの並べ替えの詳細については、テキストの検索を参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。