Firestore 索引错误
Posted
技术标签:
【中文标题】Firestore 索引错误【英文标题】:Firestore index error 【发布时间】:2018-04-18 22:30:07 【问题描述】:我在使用 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;
);
);
【问题讨论】:
我需要你的帮助! 【参考方案1】:发生此错误是因为默认情况下,Firestore 不需要为仅使用相等子句的查询附加索引,因此您的情况并非如此。
要使您的查询正常工作,您只需单击错误消息的链接并在 Firebase 控制台中为您的查询创建一个新索引。
要了解有关 Firestore 索引如何工作的更多信息,您可以阅读 documentation.
【讨论】:
【参考方案2】:也可能发生此错误,因为您查询的字段之一在扫描的文档中不存在
【讨论】:
【参考方案3】:点击提供的链接。如果它没有将您带到正确的页面,如果您收到此错误:
The project xxx either does not exist, or user doesn't have permission
退出当前用户,并以您的 Firebase 用户身份登录。
您将获得为您的查询建议的索引。
包含特定查询的查询需要复合索引 值和范围或顺序。
当您运行这些查询时,它们的性能会很差并且无法很好地扩展。
每次使用不同的字段、组合范围、等于或按运算符排序时,您都必须创建一个新索引。如果您只使用 whereEqualTo 运算符,则不需要。
根据您的数据大小,创建索引可能需要一段时间。
【讨论】:
【参考方案4】:来自文档:
管理索引
Cloud Firestore 通过要求索引来确保查询性能 每个查询。最基本的查询所需的索引是 自动为您创建。在您使用和测试您的应用程序时,Cloud Firestore 会生成错误消息,帮助您创建额外的 索引您的应用程序需要。本页介绍如何管理您的 单字段索引和复合索引。
通过错误信息创建缺失索引
如果您尝试使用不映射的范围子句进行复合查询 到现有索引,您会收到错误。错误信息包括 在 Firebase 控制台中创建缺失索引的直接链接。
Read more there.
如果您在 VS 代码或任何 IDE 中,只需按 ctrl + 左键单击即可创建缺失索引。如果那没有将您带到创建索引对话框。复制粘贴网址到浏览器。
【讨论】:
【参考方案5】:如果您使用 Firebase 托管,您可以将以下内容添加到您的 firestore.indexes.json
文件中:
"collectionGroup": "temp",
"queryScope": "COLLECTION",
"fields": [
"fieldPath": "uid",
"order": "ASCENDING"
,
"fieldPath": "startedAt",
"order": "DESCENDING"
]
当您部署 Firebase 时,它会自动构建这些索引。
您也可以使用以下命令自行部署索引:
firebase deploy --only firestore:indexes
【讨论】:
这里,如何为单字段索引添加豁免?以上是关于Firestore 索引错误的主要内容,如果未能解决你的问题,请参考以下文章
Firebase firestore 查询:“错误:9 FAILED_PRECONDITION:查询需要索引。您可以在此处创建它”