LoginSignup
10

More than 5 years have passed since last update.

Google Cloud Datastoreでキーをソート条件に使うときの注意点

Last updated at Posted at 2017-02-27

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10