GAEでDataStoreを使う場合の非常に細かい話を紹介します。
DataStoreのクエリで、第一ソート条件を日付、第二ソート条件をキーにしたいようなことがあったとしましょう。Goで書くと次のようなクエリです。
q := datastore.NewQuery("post").Order("-updated_at").Order("__key__")
このような場合、どのようなカスタムインデックスを作れば良いのでしょうか?答えは次の文書から読み取れます。
Queries on keys use indexes just like queries on properties and require custom indexes in the same cases, with a couple of exceptions: inequality filters or an ascending sort order on the key do not require a custom index, but a descending sort order on the key does. As with all queries, the development web server creates appropriate entries in the index configuration file when a query that needs a custom index is tested.
https://cloud.google.com/appengine/docs/standard/go/datastore/queries
以下拙訳。
キーに対するクエリはプロパティに対するクエリのようにインデックスを使います。これはカスタムインデックスの場合も同様ですが、いくつかの例外があります。キーに対する不等号フィルタや昇順のソートはカスタムインデックスを必要としませんが、キーに対する降順ソートはカスタムクエリが必要です。カスタムインデックスが必要なクエリがテストされたときは、開発Webサーバは適切なインデックス設定ファイルを生成します。
つまり、キーに対する昇順ソートをする場合、追加のカスタムインデックスは不要だということになります。上の例であれば特に追加のカスタムインデックスは必要なく、updated_atのインデックスだけで対応できるということになります。
言い換えると、全てのプロパティインデックスやカスタムインデックスは、キー昇順でのソートが優先度最低のソート条件になっていると解釈できそうです。つまり、上の例で言えば「.Order("__key__")
」は付けても付けなくても同じ結果になるのではないでしょうか(とはいえ、キーのソート順に依存したコードを書く場合は保守性の観点から明示的にソート順を指定した方がいいでしょう)。
また、キーを使ったフィルタやソートも他のクエリ同様にindex.yaml
の自動生成対象です。開発サーバでクエリを動かしてみてindex.yaml
が自動生成されなければ特に追加のカスタムインデックスは必要ないことがわかります。実際、上のクエリを流してもindex.yaml
は変更されませんでしたが、キーの降順ソートを試すとindex.yaml
に下記のようなインデックス定義が追加されました。
- kind: post
properties:
- name: updated_at
direction: desc
- name: __key__
direction: desc