データストアのクエリ
昨日は珍しく仕事で一緒になった方々と渋谷 (都会!) で飲みました。とても楽しく飲めたのですが、いかんせんお酒が弱いので、ビール4杯めぐらいから顔が真っ赤になっているのが分かりました。
なので (?) 今日はちょっとだらけた一日になってしまったので、少しだけ勉強してから寝ることにします (だらけたまま一日が終わるのはちょっと気持ち悪いので) 。
複数のプロパティに関するフィルタ
複数のプロパティを使ったフィルタを考えています。たとえばこんな感じ。
SELECT * Player WHERE charClass='ヒーロー' AND level < 10
これはcharClassプロパティの値が「ヒーロー」でlevelプロパティの値が10未満のエンティティを集めるクエリです。たとえば次のようなエンティティがデータストア上に存在したとします。
名前 | レベル | 得点 | クラス |
---|---|---|---|
ウルトラマン | 7 | 1366 | ヒーロー |
仮面ライダー | 22 | 1096 | ヒーロー |
バルタン星人 | 21 | 2003 | 怪獣 |
ゴレンジャー | 2 | 2003 | ヒーロー |
ショッカー | 24 | 33311 | 悪者 |
上記クエリの結果はこうありたい。
名前 | レベル | 得点 | クラス |
---|---|---|---|
ウルトラマン | 7 | 1366 | ヒーロー |
ゴレンジャー | 2 | 2003 | ヒーロー |
この結果を得るためには次のようなインデックスが必要になります。
キー | クラス | レベル | |
---|---|---|---|
ゴレンジャーのキー | ヒーロー | 2 | |
ウルトラマンのキー | ヒーロー | 7 | |
仮面ライダーのキー | ヒーロー | 22 | |
バルタン星人のキー | 怪獣 | 21 | |
ショッカーのキー | 悪者 | 24 |
つまりクラスプロパティの値でソートされ、かつレベルプロパティの値でソートされているインデックスが必要になります。
デバッグサーバーでこのクエリを実行すると次のようなindex.yamlファイルが出力されます。
- kind: Player properties: - name: charclass - name: level
なるほど、納得。ていうか今まで何でこんなシンプルなことが分からなかったんだろうか。。。