【问题标题】:Firebase Cloud Firestore: Managing indexes from codeFirebase Cloud Firestore:从代码管理索引
【发布时间】:2020-04-01 04:41:20
【问题描述】:

我正在尝试从 Firebase 实时数据库迁移到 Cloud Firestore,以便在集合之间使用“复杂”查询,但我发现了一些我不知道如何解决的“问题”。

我的服务器使用 Express JS 和 Firebase Admin SDK。我正在尝试为我的管理仪表板创建一个 CRUD 路由器,但我收到以下错误:

"9 FAILED_PRECONDITION:查询需要索引。您可以在这里创建它:...

当我访问该 URL (...) 时出现一些错误,我没有足够的权限...好吧,无论如何,经过一些研究后,我了解到“复杂”查询需要索引,并且它们必须超过一个。

这是我当前的路由器代码,因此您可以看到我想要实现的目标:

// GET - Get users
router.get('/', async (req: Request, res: Response) => {
    ...
    let ref: any = db.collection('users').orderBy('createdAt');

    Object.keys(req.query).forEach(key => {
        ref = ref.where(key, '==', req.query[key]);
    });

    ...   
});

正如您所见,当我迭代 req.query 键时,我正在向查询中添加条件语句。我的想法是从客户端以编程方式添加自定义过滤器。

根据我从文档中了解到的,我应该为每个文档属性创建一个复杂的索引类型。

因此,我应该怎么做才能实现上述想法?提前致谢。

【问题讨论】:

标签: javascript node.js firebase express google-cloud-firestore


【解决方案1】:

Firestore 复合查询有一些限制。 一是要使用多个方法,例如“where”和“orderBy”,您需要为此查询创建索引。

因此,在您的情况下,由于您的查询是动态的,因此您必须为每个查询创建一个索引。 我的建议是您只在查询中使用“where”,而在其他过滤器中使用 javascript 进行过滤。或者迁移到另一个数据库,比如 MongoDB。

这是解释复合查询的 Firestore 文档的链接:https://firebase.google.com/docs/firestore/query-data/queries?hl=en-us

【讨论】:

    猜你喜欢
    • 2020-06-21
    • 1970-01-01
    • 2020-05-20
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2021-05-27
    • 1970-01-01
    相关资源
    最近更新 更多