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

クエリを指定する

項目一覧

  • Overview
  • リテラル値
  • 比較
  • 論理
  • 要素
  • 評価
  • 配列
  • Bitwise
  • 詳細情報

このガイドでは、ドキュメントのサブセットに一致するクエリを指定する方法について説明します。

文書のサブセットをマッチングするには、一致条件を含むクエリフィルターを指定します。一致基準は、ドキュメントに含めるフィールドと値で構成されます。クエリフィルターには、結果セットに加えるドキュメントの決定要素となる一致条件を少なくとも 1 セット含めます。

クエリ フィルターでは、フィールドをリテラル値またはクエリ演算子と一致させることができます。 クエリ演算子を使用すると、数学的操作や論理的操作を実行してコレクション内のドキュメントを検索できます。

リテラル値を持つ一致条件は次の形式を使用します。

filter := bson.D{{"<field>", "<value>"}}

クエリ演算子との一致条件には次の形式が使用されます。

filter := bson.D{{"<field>", bson.D{{"<operator>", "<value>"}}}}

次のセクションでは、Find() メソッドとともにリテラル値クエリ演算子を使用して、ドキュメントのサブセットを一致させます。

このセクションの例では、tea コレクション内のドキュメントのモデルとして次の Tea 構造体を使用します。

type Tea struct {
Type string
Rating int32
Vendor []string `bson:"vendor,omitempty" json:"vendor,omitempty"`
}

omitempty 構造体タグが空のままの場合、挿入されたドキュメントの対応フィールドが省略されます。

このガイドの例を実行するには、次のスニペットを使用して、サンプル データを db データベース内の tea コレクションにロードします。

coll := client.Database("db").Collection("tea")
docs := []interface{}{
Tea{Type: "Masala", Rating: 10, Vendor: []string{"A", "C"}},
Tea{Type: "English Breakfast", Rating: 6},
Tea{Type: "Oolong", Rating: 7, Vendor: []string{"C"}},
Tea{Type: "Assam", Rating: 5},
Tea{Type: "Earl Grey", Rating: 8, Vendor: []string{"A", "B"}},
}
result, err := coll.InsertMany(context.TODO(), docs)

Tip

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

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

各ドキュメントには、お茶の品種、評価、その品種を扱っている販売業者が記載されています。これらのアイテムは、typeratingvendor フィールドに対応します。

リテラル値のクエリフィルターは、一致条件に完全に一致するドキュメントを返します。

Tip

空のクエリフィルターを指定すると、CRUD 操作はコレクション内のすべてのドキュメントをマッチングします。

次の例では、type が「Oolong」であるドキュメントをマッチングしています。

filter := bson.D{{"type", "Oolong"}}
cursor, err := coll.Find(context.TODO(), filter)
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))
}

Tip

リテラル値クエリは、比較演算子の $eq と同じ値を返します。たとえば、次のクエリフィルターにより生成される結果は同じです。

filter := bson.D{{"type", "Oolong"}}
filter := bson.D{{"type", bson.D{{"$eq", "Oolong"}}}}

比較演算子は、ドキュメント内の値を一致条件で指定された値に照らして分析します。一般的な比較演算子として、「~より大きい」という比較のための $gt、「~以下」という比較のための $lte、「~と等しくない」という比較のための $ne などが挙げられます。

次の例では、rating7 未満のドキュメントをマッチングしています。

filter := bson.D{{"rating", bson.D{{"$lt", 7}}}}
cursor, err := coll.Find(context.TODO(), filter)
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))
}

演算子の完全なリストについては、「比較クエリ演算子」ページを参照してください。

論理演算子には、少なくとも 2 つの一致条件が必要です。これらはドキュメントが指定されている基準のすべてを満たす、少なくとも 1 つを満たす、またはまったく満たさないかどうかをチェックします。よく使用される論理演算子には、すべての一致条件が true でなければならない $and、一致条件の少なくとも 1 つが true でなければならない $or などがあります。

次の例では、rating7 より大きく 10 以下のドキュメントをマッチングしています。

filter := bson.D{
{"$and",
bson.A{
bson.D{{"rating", bson.D{{"$gt", 7}}}},
bson.D{{"rating", bson.D{{"$lte", 10}}}},
},
},
}
cursor, err := coll.Find(context.TODO(), filter)
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))
}

論理演算子の完全なリストについては、「論理クエリ演算子」ページを参照してください。

Tip

複数の一致条件はリテラル クエリの $eq 比較演算子に似ており、$and 論理演算子と同じ値を返します。たとえば、次のクエリフィルターにより生成される結果は同じです。

filter := bson.D{{"type", "Oolong"}, {"rating", 7}}
filter := bson.D{
{"$and",
bson.A{
bson.D{{"type", "Oolong"}},
bson.D{{"rating", 7}},
}},
}

要素演算子は、指定されたフィールドの有無またはタイプをチェックします。

次の例では、vendor フィールドがないドキュメントをマッチングしています。

filter := bson.D{{"vendor", bson.D{{"$exists", false}}}}
cursor, err := coll.Find(context.TODO(), filter)
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))
}

要素演算子の完全なリストについては、「要素クエリ演算子」ページを参照してください。

評価演算子は、一致条件で指定された値に基づいてドキュメント内の値を分析します。よく使用される評価演算子には、フィールドの値が指定された正規表現と一致しなければならない $regex と、フィールドの値に指定された文字列が含まれていなければならない $text があります。

次の例では、type が文字「E」で始まるドキュメントをマッチングしています。

filter := bson.D{{"type", bson.D{{"$regex", "^E"}}}}
cursor, err := coll.Find(context.TODO(), filter)
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))
}

評価演算子の完全なリストについては、「評価クエリ演算子」ページを参照してください。

配列演算子は、配列フィールド内の要素の値または量をチェックします。

次の例では、vendor に「C」が含まれるドキュメントをマッチングしています。

filter := bson.D{{"vendor", bson.D{{"$all", bson.A{"C"}}}}}
cursor, err := coll.Find(context.TODO(), filter)
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))
}

配列演算子の完全なリストについては、「配列クエリ演算子」ページを参照してください。

ビット演算子は、数値フィールドを 10 進数の数値から対応する 2 進数に変換します。ドキュメント内の値に、一致条件の値と同じビットが設定されているかどうかを確認します。

次の例では、rating6 と同じビット(「00000110」)に設定されているドキュメントをマッチングしています。

filter := bson.D{{"rating", bson.D{{"$bitsAllSet", 6}}}}
cursor, err := coll.Find(context.TODO(), filter)
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))
}

ビット演算子の完全なリストについては、「ビットクエリ演算子」ページを参照してください。

地理空間クエリの指定方法については、「地理空間データに関するガイド」を参照してください。

このガイドで使用されているメソッドまたはタイプの詳細については、以下の API ドキュメントを参照してください。

  • Find()

  • Cursor

戻る

読み取り操作