Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
Go Driver
/ /

返すドキュメントを指定する

このガイドでは、次のメソッドを使用して、読み取り操作から返されるドキュメントを指定する方法を学習できます。

  • 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 フィールドに対応するコース名と最大登録者数を含みます。

結果の順序を指定するには、操作のオプションの SetSort() メソッドに並べ替えフィールドと方向を指定するインターフェースを渡します。

次の操作では、オプションとして SetSort() が使用されます。

  • Find()

  • FindOne()

  • FindOneAndDelete()

  • FindOneAndUpdate()

  • FindOneAndReplace()

  • GridFSBucket.Find()

昇順 または 降順 の並べ替え方向を設定できます。

昇順で並べ替えると、結果が最小から最大の順に並べられます。この並べ替えを指定するには、並べ替えるフィールドと 1SetSort() メソッドに渡します。

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}

降順で並べ替えると、結果が最大から最小の順に並べられます。この並べ替えを指定するには、並べ替えるフィールドと -1SetSort() メソッドに渡します。

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}

クエリから返されるドキュメントの数を制限するには、返されるドキュメントの数を読み取り操作のオプションの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 ドキュメントを参照してください。

戻る

カーソルからのデータへのアクセス

項目一覧