3. Query検索

キー検索のほかに、App Engineでは、Queryを使用した条件検索が可能です。ただし、App Engineの条件検索はRDBに比べて制約が多く、この点が分散キー・バリュー・ストアの欠点として評価される場合が多いようです。例えば、JOIN検索ができない、集計関数が使用できない、などが挙げられます。

このように、条件検索についてはマイナスのイメージでとらえられることが多いApp Engineですが、実際どの程度の検索・参照が可能なのでしょうか。以下では具体例を挙げて説明します。

[App Engineで検索パターン]

  1. Query(String kind)
  2. Query(String kind, Key , ancestorKey)
  3. Query(Key ancestorKey)
  4. Query()

App EngineにおけるQuery検索は、上記の4種類のパターンで行われます。実際には、1.または2.のパターンが多いはずです。以下からは、この順番で、それぞれの検索例を解説します。

3.1. Query(String kind)

Queryの引数にkind名を指定するパターンは、条件検索で最も多く使われる一般的なパターンです。つまり、テーブル(kind)と検索条件を指定して参照するパターンです。

(1)全件検索(revAllOrdTran1)

【リスト3】: 「Query(String kind)」パターンでの全件検索

最初に全件検索ですが、この検索では、

  • (1)で、検索対象のテーブル(kind)を指定してQueryインスタンスを生成し、
  • (2)で、検索結果をエンティティ・リストで返しますが、込み入った書式なので、その内容を確認します。
  • ds.prepare(query)
    DatastoreServiceのインスタンスであるdsに適用するメソッドprepare(query)は、実行するクエリーを準備します。
  • asListは、引数内で生成される配列をListに変換して返します。
  • FetchOptions.Builderはstaticクラスであり、Fetch(検索)用のstaticメソッドを指定して実行します。
  • withOffset(0)は、データ・ストア(kind)検索において、先頭エンティティから値を返します。

画面5: revAllOrdTran1での検索結果

画面5: revAllOrdTran1での検索結果(クリックで拡大)

画面5は、revAllOrdTran1の検索結果です。例えば、withOffset(1)を指定した場合は、2番目のエンティティ項目から値が返されます。つまり、withOffsetの「引数値-1」番目のエンティティから検索データが返されます。

DWRのメソッド実行画面で確認した場合、withOffset(0)では画面6のように、withOffset(1)では画面7のように、先頭部分が表示されます。

画面6: withOffset(0)でのDWR実行表示

画面6: withOffset(0)でのDWR実行表示(クリックで拡大)

画面7: withOffset(1)でのDWR実行表示

画面7: withOffset(1)でのDWR実行表示

その後、for文で取得したList形式のotranから、表示データを作成します。getPropertyにおけるプロパティ値取得は、これまでと同じです。

(2)イコール条件(revOrdTran1)

【リスト4】: イコール条件追加でのエンティティ検索

App Engineの条件検索指定で「フィルタオペレータ」を使います。リスト4の(1)と(3)は、リスト3と同じですが、(2)でフィルタ指定(query.addFilter)を行っています。ここでは、プロパティkind*1に対して「equality filter」が適用され、kind名が「desktop」のエンティティだけが選択されます。

  • [*1] App Engineではテーブル名をkindと呼ぶのでまぎわらしいですが、ここでのkindはプロパティ名です。

なお、App Engineで使用できるフィルタオペレータには、以下のようなものがあります。

  • Query.FilterOperator.LESS_THAN
  • Query.FilterOperator.LESS_THAN_OR_EQUAL
  • Query.FilterOperator.EQUAL
  • Query.FilterOperator.GREATER_THAN
  • Query.FilterOperator.GREATER_THAN_OR_EQUAL
  • Query.FilterOperator.NOT_EQUAL
  • Query.FilterOperator.IN (equal to any of the values in the provided list)

(3)複数フィルタ(revOrdTran21)

【リスト5】:

フィルタは、複数指定することもできます。リスト5では、店番号(shopno)に「EQUAL」を、価格(price)に「GREATER_THAN」を指定して、秋葉原1号店で価格が5万円以上の販売実績に限って表示しています。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30