Firestoreからデータをクエリするためにangular 2を使用するとき、いくつかの問題に直面しています。
誰かがそれをチェックして私を助けて、私が間違ったことを教えてくれませんか?
私のエラー:
ERROR Error: The query requires an index. You can create it here: https://console.firebase.google.com/project/admin-e8a7b/database/firestore/indexes?create_index=EgR0ZW1wGgcKA3VpZBACGg0KCXN0YXJ0ZWRBdBADGgwKCF9fbmFtZV9fEAM
at new FirestoreError (vendor.bundle.js:19925)
これは私のコードです:
getTemp(uid): Observable<any> {
let temps = [];
var today = new Date();
return this.afs.collection<Temps>('temp', ref => ref.where('uid', '==', uid).orderBy('startedAt', 'desc')).snapshotChanges()
.map(actions => {
return actions.map(action => {
const data = action.payload.doc.data() as Temps;
console.log(data.temp);
return data.temp;
});
});
}
このエラーが発生するのは、デフォルトでは、Firestoreがクエリに追加のインデックスを必要としないため等式句のみを使用するため、これは当てはまりません。
クエリを機能させるには、エラーメッセージのリンクをクリックして、Firebaseコンソールでクエリの新しいインデックスを作成するだけです。
Firestoreのインデックスがどのように機能するかについて詳しく知るには、 documentation。 を参照してください。
表示されたリンクをクリックします。正しいページに移動しない場合、このエラーが発生する場合は、次のようにします。
The project xxx either does not exist, or user doesn't have permission
現在のユーザーをログアウトし、Firebaseユーザーとしてログインします。
クエリに対して提案されたインデックスを取得します。
特定の値と範囲または順序を含むクエリには、複合インデックスが必要です。
これらのクエリを実行すると、パフォーマンスが低下し、適切にスケーリングされません。
さまざまなフィールドを使用してクエリを変更するたびに、範囲、演算子、または演算子による順序を組み合わせて、新しいインデックスを作成する必要があります。 whereEqualTo演算子のみを使用する場合は、不要です。
データサイズによっては、インデックスの作成に時間がかかる場合があります。
ドキュメントから:
インデックスの管理
Cloud Firestoreは、すべてのクエリにインデックスを要求することにより、クエリのパフォーマンスを保証します。最も基本的なクエリに必要なインデックスは自動的に作成されます。アプリを使用してテストすると、Cloud Firestoreはアプリに必要な追加のインデックスを作成するのに役立つエラーメッセージを生成します。このページでは、単一フィールドインデックスと複合インデックスを管理する方法について説明します。
エラーメッセージを使用して不足しているインデックスを作成する
既存のインデックスにマップしないrange句を使用して複合クエリを試行すると、エラーが発生します。エラーメッセージには、Firebaseコンソールで不足しているインデックスを作成するための直接リンクが含まれています。
続きを読む 。
VSコードまたは任意のIDEを使用している場合は、Ctrlキーを押しながら左クリックするだけで、不足しているインデックスを作成できます。それでもインデックス作成ダイアログが表示されない場合。 URLをコピーしてブラウザに貼り付けます。
Firebaseホスティングを使用している場合は、firestore.indexes.json
ファイルに以下を追加できます。
{
"collectionGroup": "temp",
"queryScope": "COLLECTION",
"fields": [
{
"fieldPath": "uid",
"order": "ASCENDING"
},
{
"fieldPath": "startedAt",
"order": "DESCENDING"
}
]
}
Firebaseをデプロイすると、これらのインデックスが自動的に作成されます。
または、次のコマンドを使用して、インデックスを単独でデプロイすることもできます。
firebase deploy --only firestore:indexes
スキャンしたドキュメントにクエリしたフィールドの1つが存在しないため、このエラーが発生している可能性もあります