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

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

オブジェクトのクエリは、ObjectBucket の query() を呼び出すことで行います。

以下の例では、全件検索を行っています。 結果はオブジェクト(dict)の配列として返却されます。

results = bucket.query()

全ヒット件数付きでクエリしたい場合は query() の代わりに query_with_count() を使用します。 返り値はオブジェクト配列と全件数のタプルになります。

(results, total_count) = bucket.query_with_count(where={...}, limit=10)

注意

クエリ上限数を指定するとヒット件数が上限に達した時点で検索が打ち切られますが、 queryWithCount() を使用した場合はクエリ上限数にかかわらず全検索を行うため検索に要する時間が増加します。

8.2. クエリ条件の指定

検索条件は MongoDB に対するクエリ式として指定します。 クエリ式は where キーワード引数に dict で指定します。以下に例を示します。

bucket.query(where={"name", "foo"})  # 一致条件

以下のように演算子を用いた条件も指定できます。

bucket.query(where={"age": {"$lt": 30}})  # 比較条件
bucket.query(where={"prefecture": {"$in": ["Tokyo", "Kanagawa", "Saitama"]}})  # 配列検索
bucket.query(where={"description": {"$regex": "^[a-c].*"}})  # 正規表現一致

8.2.1. 論理演算

論理演算 (and, or) で複数のクエリ式を結合することも可能です。

# AND条件
bucket.query(where={"$and": [{...}, {...}, {...}]})

# OR条件
bucket.query(where={"$or": [{...}, {...}, {...}]})

8.3. ソート順序の指定

ソート順序は、sort キーワード引数で指定します。 下記では、name 昇順を指定しています。先頭に "-" を付与すると降順になります。

bucket.query(sort="name")

複数のソート設定を行う場合はカンマで区切ります。先に設定したソートの優先度が高くなります。

bucket.query(sort="name,-age")

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

検索におけるスキップ数・上限数は、それぞれ skip, limit キーワード引数で指定します。

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

bucket.query(skip=100, limit=10)

なお、上限数の値はデフォルトで 100 となっています。 上限数を無限大(制限なし)にしたい場合は -1 を指定します。

8.4.1. プロジェクション

オブジェクトの一部のフィールドを取得する場合は、 projection キーワード引数で指定します。 下記では、"_id"フィールドと、指定した"name" フィールドを含むオブジェクトが取得できます。

bucket.query(projection={"name": 1})

逆に、特定のフィールドのみ抑制したい場合は、以下のように指定します。

bucket.query(projection={"name": 0})

上記を指定した場合、 "_id" と、指定したフィールド("name")以外のフィールドを含むオブジェクトが取得できます。

"_id" はデフォルトで付与されますが、省きたい場合は以下のように指定します。

bucket.query(projection={"name": 1, "_id": 0})

また入れ子構造となっているフィールドを指定する場合は、以下のように指定します。

bucket.query(projection={"parent.name", 1})

また、 array フィールドに対して、 MongoDB と同様に以下の演算子を使用することも可能です。

  • $elemMatch
  • $slice

注意

"$", "$meta" 演算子は対象外です。