クエリを指定する
Overview
このガイドでは、C++ ドライバーを使用してクエリを指定する方法を学習できます。
クエリフィルターを作成することで、クエリが返すドキュメントのセットを絞り込むことができます。 クエリフィルターは、読み取りまたは書込み操作においてドキュメントを照合するためにMongoDBが使用する検索条件を指定する式です。 クエリフィルターでは、クエリに完全に一致するドキュメントを検索するようにドライバーに指示することも、より複雑な一致条件をExpressするためにクエリフィルターを作成することもできます。
サンプル データ
このガイドの例では、実稼働ドキュメントを含む fruits
というコレクションに対して操作を実行します。 次のコード例は、データベースとコレクションを作成し、サンプルドキュメントをコレクションに挿入する方法を示しています。
mongocxx::uri uri("<connection string>"); mongocxx::client client(uri); auto db = client["db"]; auto collection = db["fruits"]; std::vector<bsoncxx::document::value> fruits; fruits.push_back(make_document(kvp("_id", 1), kvp("name", "apples"), kvp("qty", 5), kvp("rating", 3), kvp("color", "red"), kvp("type", make_array("fuji", "honeycrisp")))); fruits.push_back(make_document(kvp("_id", 2), kvp("name", "bananas"), kvp("qty", 7), kvp("rating", 4), kvp("color", "yellow"), kvp("type", make_array("cavendish")))); fruits.push_back(make_document(kvp("_id", 3), kvp("name", "oranges"), kvp("qty", 6), kvp("rating", 2), kvp("type", make_array("naval", "mandarin")))); fruits.push_back(make_document(kvp("_id", 4), kvp("name", "pineapples"), kvp("qty", 3), kvp("rating", 5), kvp("color", "yellow"))); auto result = collection.insert_many(fruits);
注意
mongocx::インスタンス
このページのコード例では、アプリケーション内の他の場所にmongocxx::instance
オブジェクトがすでに作成されていることを前提としています。
インスタンスの作成の詳細については、「 ドライバー インスタンスの作成 」を参照してください。
完全一致
リテラル値クエリは、クエリフィルターに完全に一致するドキュメントを返します。
次の例では、 find()
メソッドのパラメーターとしてクエリフィルターを指定します。 このコードでは、 color
フィールドの値が"yellow"
であるすべてのドキュメントが返されます。
auto cursor = collection.find(make_document(kvp("color", "yellow"))); for (auto &&doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id" : 2, "name" : "bananas", "qty" : 7, "rating" : 4, "color" : "yellow", "type" : [ "cavendish" ] } { "_id" : 4, "name" : "pineapple", "qty" : 3, "rating" : 5, "color" : "yellow" }
Tip
すべてのドキュメントの検索
コレクション内のすべてのドキュメントを検索するには、 find()
メソッドを呼び出し、そのメソッドに空のクエリフィルターを渡します。 次の例では、 コレクション内のすべてのドキュメントを検索します。
auto cursor = collection.find({});
比較演算子
比較演算子は、ドキュメントフィールド値をクエリフィルター内の指定された値に対して評価します。 次のリストでは、一般的な比較演算子を定義しています。
$gt
: より大きい$lte
: 以下$ne
: 等しくない
比較演算子の完全なリストを表示するには、 マニュアルの「 比較クエリ演算子 」MongoDB Server ガイドを参照してください。
次の例では、クエリフィルター内の 比較演算子をfind()
メソッドへのパラメーターとして指定しています。 コードは、 rating
フィールドの値が2
より大きいすべてのドキュメントを返します。
auto cursor = collection.find(make_document(kvp("rating", make_document(kvp("$gt", 2))))); for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id" : 1, "name" : "apples", "qty" : 5, "rating" : 3, "color" : "red", "type" : [ "fuji", "honeycrisp" ] } { "_id" : 2, "name" : "bananas", "qty" : 7, "rating" : 4, "color" : "yellow", "type" : [ "cavendish" ] } { "_id" : 4, "name" : "pineapples", "qty" : 3, "rating" : 5, "color" : "yellow" }
論理演算子
論理演算子は、2 つ以上の式のセットの結果に適用されたロジックを使用してドキュメントを一致させます。 以下のリストは、各論理演算子について説明します。
$and
:すべての句の条件に一致するすべてのドキュメントを返します$or
: 1 つの句の条件に一致するすべてのドキュメントを返します$nor
: どの句の条件にも一致しないすべてのドキュメントを返します$not
:式に一致しないすべてのドキュメントを返します
論理演算子の詳細については、 MongoDB Serverマニュアルの「 論理クエリ演算子 」ガイドを参照してください。
次の例では、クエリフィルターで論理演算子をfind()
メソッドへのパラメーターとして指定します。 このコードでは、 qty
フィールドの値が5
より大きいか、またはcolor
フィールドの値が"yellow"
であるすべてのドキュメントが返されます。
auto cursor = collection.find( make_document(kvp("$or", make_array(make_document(kvp("qty", make_document(kvp("$gt", 5)))), make_document(kvp("color", "yellow")))))); for (auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id" : 2, "name" : "bananas", "qty" : 7, "rating" : 4, "color" : "yellow", "type" : [ "cavendish" ] } { "_id" : 3, "name" : "oranges", "qty" : 6, "rating" : 2, "type" : [ "naval", "mandarin" ] } { "_id" : 4, "name" : "pineapples", "qty" : 3, "rating" : 5, "color" : "yellow" }
配列演算子
配列演算子は、 配列フィールド内の要素の値または量に基づいてドキュメントを一致させます。 次のリストでは、使用可能な配列演算子を説明しています。
$all
: クエリ内のすべての要素を含む配列を持つドキュメントを返します$elemMatch
: 配列フィールド内の要素がクエリ内のすべての条件に一致する場合にドキュメントを返します$size
: 指定されたサイズの配列を持つすべてのドキュメントを返します
配列演算子の詳細については、MongoDB Server マニュアルの「 配列クエリ演算子 」ガイドを参照してください。
次の例では、クエリフィルター内の配列演算子をfind()
メソッドへのパラメーターとして指定しています。 このコードでは、 type
配列フィールドに2
要素が含まれるすべてのドキュメントが返されます。
auto cursor = collection.find(make_document(kvp("type", make_document(kvp("$size", 2))))); for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id" : 1, "name" : "apples", "qty" : 5, "rating" : 3, "color" : "red", "type" : [ "fuji", "honeycrisp" ] } { "_id" : 3, "name" : "oranges", "qty" : 6, "rating" : 2, "type" : [ "naval", "mandarin" ] }
要素演算子
要素演算子は、フィールドの存在または型に基づいてデータをクエリします。
要素演算子の詳細については、 MongoDB Serverマニュアルの「 要素クエリ演算子 」ガイドを参照してください。
次の例では、クエリフィルター内の要素演算子をfind()
メソッドへのパラメーターとして指定しています。 このコードでは、 color
フィールドを持つすべてのドキュメントが返されます。
auto cursor = collection.find(make_document(kvp("color", make_document(kvp("$exists", true))))); for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id" : 1, "name" : "apples", "qty" : 5, "rating" : 3, "color" : "red", "type" : [ "fuji", "honeycrisp" ] } { "_id" : 2, "name" : "bananas", "qty" : 7, "rating" : 4, "color" : "yellow", "type" : [ "cavendish" ] } { "_id" : 4, "name" : "pineapples", "qty" : 3, "rating" : 5, "color" : "yellow" }
評価演算子
評価演算子は、個々のフィールドまたはコレクションのドキュメント全体の評価に基づいてデータを返します。
次のリストでは、一般的な評価演算子について説明します。
$text
: ドキュメントに対してテキスト検索を実行します$regex
: 指定された正規式に一致するドキュメントを返します$mod
:フィールド値に対して剰余操作を実行し、余りが指定された値であるドキュメントを返します
評価演算子の完全なリストを表示するには、 マニュアルの「 評価クエリ演算子MongoDB Server 」ガイドを参照してください。
次の例では、クエリフィルターで評価演算子をfind()
メソッドへのパラメーターとして指定しています。 このコードでは正規式を使用して、 name
フィールド値に少なくとも 2 文字の連続した"p"
文字があるすべてのドキュメントを返します。
auto cursor = collection.find(make_document(kvp("name", make_document(kvp("$regex", "p{2,}"))))); for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id" : 1, "name" : "apples", "qty" : 5, "rating" : 3, "color" : "red", "type" : [ "fuji", "honeycrisp" ] } { "_id" : 4, "name" : "pineapples", "qty" : 3, "rating" : 5, "color" : "yellow" }
詳細情報
ドキュメントのクエリの詳細については、MongoDB Server マニュアルの 「ドキュメントのクエリ」 ガイドを参照してください。
C++ドライバーを使用してドキュメントを取得する方法の詳細については、「データ取得ガイド」を参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。