返される結果の数を制限する
Overview
このガイドでは、読み取り操作から返されるドキュメントの数を制限する方法を学習できます。
サンプル データ
このガイドの例では、 courses
コレクション内のドキュメントのモデルとして、次の Course
構造体を使用します。
type Course struct { Title string Enrollment int32 }
このガイドの例を実行するには、次のスニペットを使用してサンプルデータをdb.courses
コレクションにロードします。
coll := client.Database("db").Collection("courses") docs := []interface{}{ Course{Title: "Romantic Era Music", Enrollment: 15}, Course{Title: "Concepts in Topology", Enrollment: 35}, Course{Title: "Ancient Greece", Enrollment: 100}, Course{Title: "Physiology I", Enrollment: 60}, } result, err := coll.InsertMany(context.TODO(), docs)
Tip
存在しないデータベースとコレクション
書き込み操作を実行するときに必要なデータベースとコレクションが存在しない場合は、サーバーが暗黙的にそれらを作成します。
各ドキュメントには、各ドキュメントの フィールドとtitle
enrollment
フィールドに対応する、コース名と最大登録者数を含む大学コースの説明が含まれています。
Limit
クエリから返されるドキュメントの数を制限するには、返されるドキュメントの数を読み取り操作のオプションのSetLimit()
メソッドに渡します。
次の読み取り操作は、オプション オブジェクトをパラメーターとして受け取ります。
Find()
CountDocuments()
gridfs.Bucket.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)) }
複数のオプション
他のオプションを設定する順序に関係なく、ドライバーは最後に制限動作を実行します。
例
次の例では、次の動作で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)) }
Tip
次のいずれかのオプション構成を使用しても、同じ結果が得られます。
opts := options.Find().SetSort(bson.D{{"enrollment", -1}}).SetSkip(1).SetLimit(2) opts := options.Find().SetLimit(2).SetSort(bson.D{{"enrollment", -1}}).SetSkip(1) opts := options.Find().SetLimit(2).SetSkip(1).SetSort(bson.D{{"enrollment", -1}}) opts := options.Find().SetSkip(1).SetSort(bson.D{{"enrollment", -1}}).SetLimit(2) opts := options.Find().SetSkip(1).SetLimit(2).SetSort(bson.D{{"enrollment", -1}})
集計
また、集計パイプラインで制限を指定するには、 $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)) }
詳細情報
上記で説明されている操作の詳細については、次のガイドを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。