かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Firebase Cloud Firestore で複数の OrderBy で 9 FAILED_PRECONDITION: The query requires an index なエラーになった

Cloud Firestore からデータを取ってこようとしたら次のようなエラーが返ってきた。

{
  error: {
    code: 9,
    details: "The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/<projectName>/firestore/indexes?...",
    message: "9 FAILED_PRECONDITION: The query requires an index. You can create it here: https://console.firebase.google.com/v1/r/project/<projectName>/firestore/indexes?...",
    metadata: …
  }
}

9 FAILED_PRECONDITION なエラーになるコード

const db = admin.firestore();

const snapshot = await db
  .collection(COLLECTION)
  .orderBy('score', 'asc')
  .orderBy('createAt', 'asc')
  .get();

どうやら orderBy() が複数個あるとエラーになってしまうようでした。

Cloud Firestore にインデックスが作成されてないとエラーになる

エラーを見ていると The query requires an index. You can create it here: https://console.firebase.google.com/... と書かれていました。
エラーに続く URL にアクセスすると Firebase コンソールから Cloud Firestore にインデックスを作成するか聴かれるモーダルが表示されます。そのまま作成ボタンを押すとインデックスが作成されます。

firebase Cloud Firestore console

インデックスのビルドに少し時間がかかりますが、ステータスが 有効 になればインデックスが有効になり先の 9 FAILED_PRECONDITION になっていたクエリが実行できるようになりました。

インデックスが必要だと分かっている場合は、コンソールから前もってから作成しておくのが良さそうです。
インデックスが全く作成されていないプロジェクトなら Cloud Firestore のインデックス タブを選択して インデックスを作成ボタン から作成することができます。

firebase Cloud Firestore console

所管

複数のフィールドで並べ替えを行うこともできます。たとえば、州で並べ替え、各州の中で人口の降順で並べ替える場合は、次のようにします。

citiesRef.orderBy("state").orderBy("population", "desc");
cf. Order and limit data with Cloud Firestore  |  Firebase

公式ドキュメントに orderBy() を複数使う例が載っていて、そこにインデックスが必要なことが書かれていなかったので、そもそも Firestore に接続できてないのか?なども疑ってハマってしまいました。
Firebase のドキュメント総じて分かりにくい気がしてるのは僕だけ?
そして作成されたインデックスの削除の方法が分からない…


[参考]

ナイン (講談社文庫)

ナイン (講談社文庫)