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 にインデックスを作成するか聴かれるモーダルが表示されます。そのまま作成ボタンを押すとインデックスが作成されます。
インデックスのビルドに少し時間がかかりますが、ステータスが 有効 になればインデックスが有効になり先の 9 FAILED_PRECONDITION
になっていたクエリが実行できるようになりました。
インデックスが必要だと分かっている場合は、コンソールから前もってから作成しておくのが良さそうです。
インデックスが全く作成されていないプロジェクトなら Cloud Firestore のインデックス タブを選択して インデックスを作成ボタン
から作成することができます。
所管
複数のフィールドで並べ替えを行うこともできます。たとえば、州で並べ替え、各州の中で人口の降順で並べ替える場合は、次のようにします。
citiesRef.orderBy("state").orderBy("population", "desc");cf. Order and limit data with Cloud Firestore | Firebase
公式ドキュメントに orderBy()
を複数使う例が載っていて、そこにインデックスが必要なことが書かれていなかったので、そもそも Firestore に接続できてないのか?なども疑ってハマってしまいました。
Firebase のドキュメント総じて分かりにくい気がしてるのは僕だけ?
そして作成されたインデックスの削除の方法が分からない…
[参考]