Docs Menu
Docs Home
/ / /
Go Driver
/ / /

Retrieve Data

項目一覧

  • Overview
  • サンプル データ
  • 検索操作
  • すべてのドキュメントの検索
  • 1 つのドキュメントの検索
  • 動作の変更
  • 集計操作
  • 集計
  • 動作の変更
  • 詳細情報
  • API ドキュメント

このガイドでは、読み取り操作を使用して 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

存在しないデータベースとコレクション

書き込み操作を実行するときに必要なデータベースとコレクションが存在しない場合は、サーバーが暗黙的にそれらを作成します。

各ドキュメントには、カスタマーが注文したお茶の品種、評価、注文日が記載されています。 これらの説明は、 itemratingdate_orderedフィールドに対応します。

検索操作を使用して、MongoDB からデータを取得します。 Find()検索操作は、FindOne() メソッドと メソッドで構成されています。

Find()メソッドでは、 Context型とクエリフィルターを渡す必要があります。 メソッドでは、フィルターに一致するすべてのドキュメントがCursorタイプとして返されます。

Find()メソッドを使用する例については、このページの「検索例」セクションを参照してください。 カーソルを使用してデータにアクセスする方法については、「 カーソルからのデータへのアクセス」ガイドを参照してください。

FindOne()メソッドでは、 Context型とクエリフィルターを渡す必要があります。 メソッドは、フィルターに一致する最初のドキュメントSingleResultタイプとして返します。

FindOne()メソッドを使用する例については、このページの「1 つの例を検索」セクションを参照してください。 FindOne()を使用し、特定のObjectId値を使用してクエリを実行する例については、このページの「 ObjectId による 1 つの検索の例」セクションを参照してください。

SingleResult型からデータにアクセスする方法については、BSON ガイドの「アン マーシャリング」を参照してください。

Find()FindOne()の動作を変更するには、それぞれFindOptionsFindOneOptionsタイプを渡します。 オプションを指定しない場合、ドライバーは各オプションのデフォルト値を使用します。

両方のタイプで一般的に使用されるオプションは、次の方法で構成できます。

方式
説明
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

次の例では、コンテキスト、フィルター、 FindOptionsFind()メソッドに渡し、次のアクションを実行します。

  • 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"}

次の例では、コンテキスト、フィルター、 FindOneOptionsFindOne()メソッドに渡し、次のアクションを実行します。

  • 一致するドキュメントは、 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"}

この例では、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値を持つドキュメントと一致する

  • 一致したドキュメントの フィールドと フィールドのみをプロジェクションするItemRating

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 ドキュメントを参照してください。

戻る

ドキュメントをカウント