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:查询需要索引。您可以在此处创建它”

在 Firestore 中自动创建集合

使用 pg_restore 恢复表不包括主键或索引

如何从firestore的路径中获取布尔值

如何为 Firestore 创建大量示例数据?

Cloud Firestore 事务的限制