7. オブジェクトストレージ:クエリ

7.1. オブジェクトのクエリ

オブジェクトのクエリは、バケットに対して Query() を呼び出すことで行います。

以下の例では、全件検索を行っています。

// オブジェクトのクエリ
NbObjectBucket bucket(service1, "testBucket");
NbQuery query;

NbResult<std::vector<NbObject>> result = bucket.Query(query);
if(result.IsSuccess()) {
    // 処理成功
    for(auto aObject : result.GetSuccessData()) {
        // 検索にヒットしたオブジェクトにアクセス
    }
}

クエリ条件は、NbQuery クラスを使用して指定します。 NbQuery を生成し、メソッドを呼び出して条件を追加していきます。

7.2. クエリ条件の指定

NbQuery query;

query.EqualTo("name", "foo"); // 一致条件
query.LessThan("age", 30);    // 比較条件
query.In("prefecture", NbJsonArray(std::string{R"(["Tokyo","Osaka"])"})); // 配列検索条件
query.Regex("description", "^[a-c].*"); // 正規表現一致

条件指定メソッドは query自身を返すので、同様の条件を以下のように記述することができます。

query.EqualTo("name", "foo")
        .LessThan("age", 30)
        .In("prefecture", NbJsonArray(std::string{R"(["Tokyo","Osaka"])"}))
        .Regex("description", "^[a-c].*");

7.2.1. 論理演算

論理演算 (and, or) で複数の NbQuery を結合することが可能です。

NbQuery query;
NbQuery query1;
NbQuery query2;

query.EqualTo("key0", 0);
query1.GreaterThanOrEqual("key1", 100);
query2.LessThan("key2", 200);

std::vector<NbQuery> conditions {query1, query2};
query.And(conditions);

not 演算子を用いることで、特定のキーに対する条件式を反転することができます。

// 以下は !(score1 > 80) && (score2 > 70) という意味
// score1 フィールドが存在しないオブジェクトにもヒットするが、
// score2 フィールドが存在しないオブジェクトにはヒットしない。
query1.GreaterThan("score1", 80)
        .Not("score1")
        .GreaterThan("score2", 70);

// 以下は (score1 <= 80) && (score2 > 70) という意味
// 上記と似ているが、score1 フィールドが存在しないオブジェクトにはヒットしない点が異なる。
query2.LessThanOrEqual("score1", 80)
        .GreaterThan("score2", 70);

7.3. ソート順序の指定

ソート順序は、OrderBy() で指定します。

std::vector<std::string> order_by{"key1", "-key2"};
query.OrderBy(order_by);

ここでは、key1を昇順、key2を降順にソートします。 指定の文字列の先頭を"-"にした場合は降順の指定となります。 ここでは先に指定したkey1が優先され昇順にソートされます。その後key1が同一値の要素に対してkey2の降順にソートが行われます。

7.4. スキップ数・検索上限数の指定

検索におけるスキップ数・上限数は、それぞれ Skip(), Limit() で指定します。

以下の例では、100件目から最大10件を読むという指定になります。

query.Skip(100).Limit(10);

なお、Limitに指定可能な範囲は-1~100 となっています。 -1の場合、制限なしとして動作します。 範囲外の値を指定した場合、パラメータは無効となります。

スキップ数・上限数を指定した際に、全ヒット件数を合わせて取得したい場合は NbObjectBucketの第二引数を使用します。

クエリ成功時に全ヒット件数がcountに渡されます。

int count;
bucket.Query(query, &count);

注意

上限数を指定するとヒット件数が上限に達した時点で検索が打ち切られます。 一方Queryの引数にcount を指定すると、上限数にかかわらず全検索を行うため、検索に要する時間が増加します。