クエリを指定する
Overview
このガイドでは、ドキュメントのサブセットに一致するクエリを指定する方法について説明します。
文書のサブセットをマッチングするには、一致条件を含むクエリフィルターを指定します。一致基準は、ドキュメントに含めるフィールドと値で構成されます。クエリフィルターには、結果セットに加えるドキュメントの決定要素となる一致条件を少なくとも 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
存在しないデータベースとコレクション
書き込み操作を実行するときに必要なデータベースとコレクションが存在しない場合は、サーバーが暗黙的にそれらを作成します。
各ドキュメントには、お茶の品種、評価、その品種を扱っている販売業者が記載されています。これらのアイテムは、type
、rating
、vendor
フィールドに対応します。
リテラル値
リテラル値のクエリフィルターは、一致条件に完全に一致するドキュメントを返します。
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)) }
{"type":"Oolong","rating":7,"vendor":["C"]}
Tip
リテラル値クエリは、比較演算子の $eq
と同じ値を返します。たとえば、次のクエリフィルターにより生成される結果は同じです。
filter := bson.D{{"type", "Oolong"}}
filter := bson.D{{"type", bson.D{{"$eq", "Oolong"}}}}
比較
比較演算子は、ドキュメント内の値を一致条件で指定された値に照らして分析します。一般的な比較演算子として、「~より大きい」という比較のための $gt
、「~以下」という比較のための $lte
、「~と等しくない」という比較のための $ne
などが挙げられます。
例
次の例では、rating
が7
未満のドキュメントをマッチングしています。
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)) }
{"type":"English Breakfast","rating":6} {"type":"Assam","rating":5}
演算子の完全なリストについては、「比較クエリ演算子」ページを参照してください。
論理
論理演算子には、少なくとも 2 つの一致条件が必要です。これらはドキュメントが指定されている基準のすべてを満たす、少なくとも 1 つを満たす、またはまったく満たさないかどうかをチェックします。よく使用される論理演算子には、すべての一致条件が true でなければならない $and
、一致条件の少なくとも 1 つが true でなければならない $or
などがあります。
例
次の例では、rating
が 7
より大きく 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)) }
{"type":"Masala","rating":10,"vendor":["A","C"]} {"type":"Earl Grey","rating":8,"vendor":["A","B"]}
論理演算子の完全なリストについては、「論理クエリ演算子」ページを参照してください。
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)) }
{"type":"English Breakfast","rating":6} {"type":"Assam","rating":5}
要素演算子の完全なリストについては、「要素クエリ演算子」ページを参照してください。
評価
評価演算子は、一致条件で指定された値に基づいてドキュメント内の値を分析します。よく使用される評価演算子には、フィールドの値が指定された正規表現と一致しなければならない $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)) }
{"type":"English Breakfast","rating":6} {"type":"Earl Grey","rating":8,"vendor":["A","B"]}
評価演算子の完全なリストについては、「評価クエリ演算子」ページを参照してください。
配列
配列演算子は、配列フィールド内の要素の値または量をチェックします。
例
次の例では、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)) }
{"type":"Masala","rating":10,"vendor":["A","C"]} {"type":"Oolong","rating":7,"vendor":["C"]}
配列演算子の完全なリストについては、「配列クエリ演算子」ページを参照してください。
Bitwise
ビット演算子は、数値フィールドを 10 進数の数値から対応する 2 進数に変換します。ドキュメント内の値に、一致条件の値と同じビットが設定されているかどうかを確認します。
例
次の例では、rating
が 6
と同じビット(「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)) }
{"type":"English Breakfast","rating":6} {"type":"Oolong","rating":7,"vendor":["C"]}
ビット演算子の完全なリストについては、「ビットクエリ演算子」ページを参照してください。
詳細情報
地理空間クエリの指定方法については、「地理空間データに関するガイド」を参照してください。
API ドキュメント
このガイドで使用されているメソッドまたはタイプの詳細については、以下の API ドキュメントを参照してください。