使用angular 2从Firestore查询数据时,我遇到了一些问题。
有人可以通过检查并告诉我哪里做错了来帮助我吗?
我的错误:
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;
});
});
}
答案 0 :(得分:11)
发生此错误是因为默认情况下,Firestore不需要为仅使用相等条款的查询添加其他索引,因此情况并非如此。
要使查询正常工作,您只需单击错误消息的链接,然后在Firebase控制台中为查询创建新索引。
要了解有关Firestore索引如何工作的更多信息,请阅读documentation.
答案 1 :(得分:1)
也可能发生此错误,因为您查询的某个字段在扫描的文档中不存在
答案 2 :(得分:0)
单击提供的链接。如果没有将您带到正确的页面,则出现此错误:
The project xxx either does not exist, or user doesn't have permission
退出当前用户,然后以您的Firebase用户身份登录。
您将获得建议用于查询的索引。
包含特定查询的查询需要复合索引 值和范围或顺序。
运行这些查询时,它们的性能会很差,扩展性也不会很好。
每次使用不同的字段更改查询时,结合范围,等于或按运算符排序,您都必须创建一个新索引。如果只使用whereEqualTo运算符,则不需要。
创建索引可能需要一段时间,具体取决于您的数据大小。
答案 3 :(得分:0)
来自文档:
管理索引
Cloud Firestore通过要求一个索引来确保查询性能 每个查询。最基本查询所需的索引是 自动为您创建。使用和测试应用程序时,云 Firestore会生成错误消息,以帮助您创建其他消息 为您的应用程序编制索引。此页面介绍了如何管理您的 单字段索引和复合索引。
通过错误消息创建丢失的索引
如果您尝试使用不映射的范围子句进行复合查询 到现有索引,您将收到一个错误。错误消息包括 直接链接以在Firebase控制台中创建缺少的索引。
如果您使用VS代码或任何IDE,只需按ctrl +左键单击它即可带您创建丢失的索引。如果那没有带您进入创建索引对话框。将网址复制粘贴到浏览器中。
答案 4 :(得分:0)
如果您使用Firebase托管,则可以将以下内容添加到firestore.indexes.json
文件中:
{
"collectionGroup": "temp",
"queryScope": "COLLECTION",
"fields": [
{
"fieldPath": "uid",
"order": "ASCENDING"
},
{
"fieldPath": "startedAt",
"order": "DESCENDING"
}
]
}
部署Firebase时,它将自动建立这些索引。
您也可以使用以下命令自行部署索引:
firebase deploy --only firestore:indexes