我在使用 Angular 2 从 Firestore 查询数据时遇到一些问题。
有人可以帮我检查一下并告诉我哪里做错了吗?
我的错误:
ERROR 错误:查询需要索引。您可以在此处创建:https://console.firebase.google.com/project/admin-e8a7b/database/firestore/indexes?create_index=EgR0ZW1wGgcKA3VpZBACGg0KCXN0YXJ0ZWRBdBADGgwKCF9fbmFtZV9fEAM 在新的 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 索引如何工作的更多信息,您可以阅读 文档。
单击提供的链接。如果它没有带您到正确的页面,如果您收到此错误:
The project xxx either does not exist, or user doesn't have permission
注销当前用户,然后以您的 Firebase 用户身份登录。
您将获得为您的查询建议的索引。
包含特定内容的查询需要复合索引 值和范围或顺序。
当您运行这些查询时,它们的性能会很差并且无法很好地扩展。
每次使用不同字段、组合范围、等于或排序运算符更改查询时,您都必须创建一个新索引。如果您只使用 whereEqualTo 运算符,则不需要。
根据您的数据大小,创建索引可能需要一段时间。
此错误也可能是因为扫描的文档中不存在您查询的字段之一而发生
来自医生:
管理索引
Cloud Firestore 通过要求索引来确保查询性能 每个查询。最基本的查询所需的索引是 自动为您创建。当您使用和测试您的应用程序时,Cloud Firestore 会生成错误消息,帮助您创建其他 索引您的应用程序所需的内容。本页介绍了如何管理您的 单字段和复合索引。
通过错误消息创建缺失索引
如果您尝试使用不映射的范围子句进行复合查询 到现有索引,您会收到错误。错误信息包括 用于在 Firebase 控制台中创建缺失索引的直接链接。
如果您在 VS code 或任何 IDE 中,只需按 ctrl + 左键单击即可创建丢失的索引。如果这没有带您进入创建索引对话框。复制粘贴网址到浏览器。
如果您使用 Firebase 托管,您可以将以下内容添加到您的
firestore.indexes.json
文件中:
{
"collectionGroup": "temp",
"queryScope": "COLLECTION",
"fields": [
{
"fieldPath": "uid",
"order": "ASCENDING"
},
{
"fieldPath": "startedAt",
"order": "DESCENDING"
}
]
}
当您部署 Firebase 时,它会自动构建这些索引。
您也可以使用以下命令自行部署索引:
firebase deploy --only firestore:indexes
单击给定的链接更新这些索引后,您可能希望将它们备份到本地存储库,以便以后使用以下方法部署到不同的环境:
firebase firestore:indexes --database=DB_NAME > firestore.indexes.json
如果您只想使用(默认)数据库,可以省略
--database
标志。
这个以及规则文件是在部署期间通过
firebase.json
文件捕获的:
{
"$schema": "https://raw.githubusercontent.com/firebase/firebase-tools/master/schema/firebase-config.json",
"firestore": [
{
"database": "DB_NAME",
"rules": "firestore.rules",
"indexes": "firestore.indexes.json"
}
],
为了方便起见,可以添加架构行以支持 VSCode 或其他方式的 linting。
再次强调,
database
字段允许您定位特定数据库。 如果您想坚持(默认),您可以摆脱数组并直接定义规则和索引:
{
"firestore": {
"rules": "firestore.rules",
"indexes": "firestore.indexes.json"
},
在部署时,您可以简单地部署
firebase.json
中定义的所有内容或使用 --only
指令部署特定部分:
firebase deploy --only firestore:indexes,firestore:rules
在上述情况下,您只想部署 firestore 索引和 firestore 规则。
注意:您每次都必须包含
firestore:
前缀,否则将两个部署作为单独的命令运行。