Firestore 错误:查询需要索引

问题描述 投票:0回答:6

我在使用 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;
    });
  });
}
angular firebase google-cloud-firestore
6个回答
22
投票

发生此错误是因为默认情况下 Firestore 不需要为仅使用相等子句的查询添加额外索引,因此这不是您的情况。

要使查询正常工作,您只需单击错误消息的链接并在 Firebase 控制台中为查询创建新索引。

要了解有关 Firestore 索引如何工作的更多信息,您可以阅读 文档。


4
投票

单击提供的链接。如果它没有带您到正确的页面,如果您收到此错误:

The project xxx either does not exist, or user doesn't have permission

注销当前用户,然后以您的 Firebase 用户身份登录。

您将获得为您的查询建议的索引。

包含特定内容的查询需要复合索引 值和范围或顺序。

当您运行这些查询时,它们的性能会很差并且无法很好地扩展。

每次使用不同字段、组合范围、等于或排序运算符更改查询时,您都必须创建一个新索引。如果您只使用 whereEqualTo 运算符,则不需要。

根据您的数据大小,创建索引可能需要一段时间。


0
投票

此错误也可能是因为扫描的文档中不存在您查询的字段之一而发生


0
投票

来自医生:

管理索引

Cloud Firestore 通过要求索引来确保查询性能 每个查询。最基本的查询所需的索引是 自动为您创建。当您使用和测试您的应用程序时,Cloud Firestore 会生成错误消息,帮助您创建其他 索引您的应用程序所需的内容。本页介绍了如何管理您的 单字段和复合索引。

通过错误消息创建缺失索引

如果您尝试使用不映射的范围子句进行复合查询 到现有索引,您会收到错误。错误信息包括 用于在 Firebase 控制台中创建缺失索引的直接链接。

在那里阅读更多内容

如果您在 VS code 或任何 IDE 中,只需按 ctrl + 左键单击即可创建丢失的索引。如果这没有带您进入创建索引对话框。复制粘贴网址到浏览器。


0
投票

如果您使用 Firebase 托管,您可以将以下内容添加到您的

firestore.indexes.json
文件中:

{
  "collectionGroup": "temp",
  "queryScope": "COLLECTION",
  "fields": [
    {
      "fieldPath": "uid",
      "order": "ASCENDING"
    },
    {
      "fieldPath": "startedAt",
      "order": "DESCENDING"
    }
  ]
}

当您部署 Firebase 时,它会自动构建这些索引。

您也可以使用以下命令自行部署索引:

firebase deploy --only firestore:indexes


0
投票

单击给定的链接更新这些索引后,您可能希望将它们备份到本地存储库,以便以后使用以下方法部署到不同的环境:

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:
前缀,否则将两个部署作为单独的命令运行。

© www.soinside.com 2019 - 2024. All rights reserved.