Retrieve Data
Overview
このガイドでは、読み取り操作を使用して MongoDB コレクションからデータを検索する方法を学びます。
読み取り操作では、次の操作を実行できます。
サンプル データ
このガイドの例では、 tea
コレクション内のドキュメントのモデルとして、次の Tea
構造体を使用します。
type Tea struct { Item string `bson:"item,omitempty"` Rating int32 `bson:"rating,omitempty"` DateOrdered time.Time `bson:"date_ordered,omitempty"` }
このガイドの例を実行するには、次のスニペットを使用して、これらのドキュメントをdb
データベースのtea
コレクションにロードします。
coll := client.Database("db").Collection("tea") docs := []interface{}{ Tea{Item: "Masala", Rating: 10, DateOrdered: time.Date(2009, 11, 17, 0, 0, 0, 0, time.Local)}, Tea{Item: "Sencha", Rating: 7, DateOrdered: time.Date(2009, 11, 18, 0, 0, 0, 0, time.Local)}, Tea{Item: "Masala", Rating: 9, DateOrdered: time.Date(2009, 11, 12, 0, 0, 0, 0, time.Local)}, Tea{Item: "Masala", Rating: 8, DateOrdered: time.Date(2009, 12, 1, 0, 0, 0, 0, time.Local)}, Tea{Item: "Sencha", Rating: 10, DateOrdered: time.Date(2009, 12, 17, 0, 0, 0, 0, time.Local)}, Tea{Item: "Hibiscus", Rating: 4, DateOrdered: time.Date(2009, 12, 18, 0, 0, 0, 0, time.Local)}, } result, err := coll.InsertMany(context.TODO(), docs)
Tip
存在しないデータベースとコレクション
書き込み操作を実行するときに必要なデータベースとコレクションが存在しない場合は、サーバーが暗黙的にそれらを作成します。
各ドキュメントには、カスタマーが注文したお茶の品種、評価、注文日が記載されています。 これらの説明は、 item
、 rating
、 date_ordered
フィールドに対応します。
検索操作
検索操作を使用して、MongoDB からデータを取得します。 Find()
検索操作は、FindOne()
メソッドと メソッドで構成されています。
すべてのドキュメントの検索
Find()
メソッドでは、 Context
型とクエリフィルターを渡す必要があります。 メソッドでは、フィルターに一致するすべてのドキュメントがCursor
タイプとして返されます。
Find()
メソッドを使用する例については、このページの「検索例」セクションを参照してください。 カーソルを使用してデータにアクセスする方法については、「 カーソルからのデータへのアクセス」ガイドを参照してください。
1 つのドキュメントの検索
FindOne()
メソッドでは、 Context
型とクエリフィルターを渡す必要があります。 メソッドは、フィルターに一致する最初のドキュメントをSingleResult
タイプとして返します。
FindOne()
メソッドを使用する例については、このページの「1 つの例を検索」セクションを参照してください。 FindOne()
を使用し、特定のObjectId
値を使用してクエリを実行する例については、このページの「 ObjectId による 1 つの検索の例」セクションを参照してください。
SingleResult
型からデータにアクセスする方法については、BSON ガイドの「アン マーシャリング」を参照してください。
動作の変更
Find()
とFindOne()
の動作を変更するには、それぞれFindOptions
とFindOneOptions
タイプを渡します。 オプションを指定しない場合、ドライバーは各オプションのデフォルト値を使用します。
両方のタイプで一般的に使用されるオプションは、次の方法で構成できます。
方式 | 説明 |
---|---|
SetCollation() | The type of language collation to use when sorting results. Default: nil |
SetLimit() | The maximum number of documents to return. Default: 0 This option is not available for FindOneOptions . The
FindOne() method internally uses SetLimit(-1) . |
SetProjection() | The fields to include in the returned documents. Default: nil |
SetSkip() | The number of documents to skip. Default: 0 |
SetSort() | The field and type of sort to order the matched documents. You can specify an ascending or descending sort. Default: none |
検索例
次の例では、コンテキスト、フィルター、 FindOptions
をFind()
メソッドに渡し、次のアクションを実行します。
rating
の値が5
から9
まで(排他的)のドキュメントに一致します一致したドキュメントを の昇順でソートします
date_ordered
filter := bson.D{ {"$and", bson.A{ bson.D{{"rating", bson.D{{"$gt", 5}}}}, bson.D{{"rating", bson.D{{"$lt", 9}}}}, }}, } sort := bson.D{{"date_ordered", 1}} opts := options.Find().SetSort(sort) // Retrieves documents that match the filter and prints them as structs cursor, err := coll.Find(context.TODO(), filter, opts) if err != nil { panic(err) } var results []Tea 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)) }
{"item":"Sencha","rating":7,"date_ordered":"2009-11-18T05:00:00Z"} {"item":"Masala","rating":8,"date_ordered":"2009-12-01T05:00:00Z"}
1 つの例を見つける
次の例では、コンテキスト、フィルター、 FindOneOptions
をFindOne()
メソッドに渡し、次のアクションを実行します。
一致するドキュメントは、
date_ordered
の値が 2009 年 11 月 30 日以前一致した最初の 2 つのドキュメントをスキップ
filter := bson.D{{"date_ordered", bson.D{{"$lte", time.Date(2009, 11, 30, 0, 0, 0, 0, time.Local)}}}} opts := options.FindOne().SetSkip(2) // Retrieves a document that matches the filter and prints it as // a struct var result Tea err := coll.FindOne(context.TODO(), filter, opts).Decode(&result) if err != nil { if err == mongo.ErrNoDocuments { fmt.Println("No documents found") } else { panic(err) } } res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res))
{"item":"Masala","rating":9,"date_ordered":"2009-11-12T05:00:00Z"}
ObjectId で 1 を検索する例
この例では、id
型の値を持つ 変数を定義し、ObjectId
id
を使用してクエリフィルターを指定しています。フィルターは、 id
変数に対応する_id
フィールド値を持つドキュメントと一致します。 この例では、 _id
値に基づいて次のドキュメントをクエリします。
{ _id: ObjectId('65170b42b99efdd0b07d42de'), item: "Hibiscus", rating : 4, date_ordered : 2009-12-18T05:00:00.000+00:00 }
次のコードでは、フィルターとFindOneOptions
インスタンスをパラメーターとしてFindOne()
メソッドに渡し、次のアクションを実行します。
指定された
ObjectId
値を持つドキュメントと一致する一致したドキュメントの フィールドと フィールドのみをプロジェクションする
Item
Rating
id, err := primitive.ObjectIDFromHex("65170b42b99efdd0b07d42de") if err != nil { panic(err) } // Creates a filter to match a document that has the specified // "_id" value filter := bson.D{{"_id", id}} opts := options.FindOne().SetProjection(bson.D{{"item", 1}, {"rating", 1}}) // Retrieves a document that matches the filter and prints it as // a struct var result Tea err = coll.FindOne(context.TODO(), filter, opts).Decode(&result) if err != nil { if err == mongo.ErrNoDocuments { fmt.Println("No documents found") } else { panic(err) } } res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res))
{"item":"Hibiscus","rating":4}
注意
Go ドライバーは各ドキュメントの_id
フィールドに対して一意のObjectId
値を自動的に生成するため、 ObjectId
値は前のコード例と異なる場合があります。 _id
フィールドの詳細については、 ドキュメントの挿入 ページの [ _id フィールド ]セクションを参照してください。
集計操作
集計操作を使用して、MongoDB からデータを取得して変換します。 Aggregate()
メソッドを使用して集計操作を実行します。
集計
Aggregate()
メソッドでは、 Context
タイプと集計パイプラインを渡すことが想定されています。 集計パイプラインは、ステージを通じてデータを変換する方法を定義します。 一部のステージは、ドキュメントの一致、フィールドの名前変更、値のグループ化です。
このメソッドでは、 Cursor
タイプの結果ドキュメントが返されます。 $matchステージを省略すると、パイプラインはコレクション内のすべてのドキュメントを使用して続行します。
カーソル内のデータにアクセスする方法については、「 カーソルからデータにアクセスする 」を参照してください。
動作の変更
Aggregate()
メソッドはオプションで、その動作を変更するために使用できるオプションを表すAggregateOptions
タイプを取ります。 オプションを指定しない場合、ドライバーは各オプションのデフォルト値を使用します。
AggregateOptions
タイプでは、次の方法でオプションを設定できます。
方式 | 説明 |
---|---|
SetAllowDiskUse() | Whether to write to temporary files. Default: false |
SetBatchSize() | The number of documents to return in each batch. Default: none |
SetBypassDocumentValidation() | Whether to allow the write to opt-out of document level validation. Default: false |
SetCollation() | The type of language collation to use when sorting results. Default: nil |
SetMaxTime() | The maximum amount of time that the query can run on the server. Default: nil |
SetMaxAwaitTime() | The maximum amount of time for the server to wait on new documents to satisfy a tailable cursor query. Default: nil |
SetComment() | An arbitrary string to help trace the operation through the database profiler, currentOp and logs. Default: "" |
SetHint() | The index to use to scan for documents to retrieve. Default: nil |
SetLet() | Specifies parameters for the aggregate expression, which improves command readability by separating the variables from the query text. Default: none |
例
次の例では、コンテキストと、次のアクションを実行する集計パイプラインを渡します。
並べ替えアイテムごとにレビューをグループ化
各項目の平均評価を計算
groupStage := bson.D{ {"$group", bson.D{ {"_id", "$item"}, {"average", bson.D{ {"$avg", "$rating"}, }}, }}} cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{groupStage}) if err != nil { panic(err) } // Prints the average "rating" for each item var results []bson.M if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { fmt.Printf("%v had an average rating of %v \n", result["_id"], result["average"]) }
Sencha had an average rating of 8.5 Hibiscus had an average rating of 4 Masala had an average rating of 9
集計パイプラインの構築方法の詳細については、MongoDB サーバーのマニュアル ページ「集計 」を参照してください。
詳細情報
検索操作の実行可能な例については、次の使用例を参照してください。
上記で説明されている操作の詳細については、次のガイドを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。