AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

Retrieve Data

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

結果をソートするときに使用する言語照合のタイプ。
デフォルト: nil

SetLimit()

返されるドキュメントの最大数。
デフォルト: 0
このオプションは FindOneOptions では使用できません。FindOne() メソッドは内部的に SetLimit(-1) を使用します。

SetProjection()

返されるドキュメントに含めるフィールド。
デフォルト: nil

SetSkip()

スキップするドキュメントの数。
デフォルト: 0

SetSort()

一致したドキュメントを順序付けるフィールドとソートの種類。昇順または降順の並べ替えを指定できます。
デフォルト: なし

次の例では、コンテキスト、フィルター、 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()

一時ファイルへの書き込みの可否。
デフォルト: false

SetBatchSize()

各バッチするで返すドキュメントの数。デフォルト:
なし

SetBypassDocumentValidation()

書き込み (write) 時にドキュメント レベルの検証をオプトアウトできるようにするかどうか。
デフォルト: false

SetCollation()

結果をソートするときに使用する言語照合のタイプ。
デフォルト: nil

SetMaxTime()

サーバー上でクエリを実行する最大時間。
デフォルト: nil

SetMaxAwaitTime()

新しいドキュメントが追尾可能 (tailable) カーソルクエリを満たすまでにサーバーが待機する最大時間。
デフォルト: nil

SetComment()

データベースプロファイラー、currentOp、およびログを使用して操作を追跡するのに役立つ任意の文字列。
デフォルト: ""

SetHint()

検索するドキュメントをスキャンするために使用するインデックス。
デフォルト: nil

SetLet()

集計式のパラメーターを指定します。これにより、変数をクエリテキストから分離して、コマンドの読みやすさを向上させます。デフォルト:
なし

次の例では、コンテキストと、次のアクションを実行する集計パイプラインを渡します。

  • 並べ替えアイテムごとにレビューをグループ化

  • 各項目の平均評価を計算

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