【问题标题】:Query nested documents in Firebase functions在 Firebase 函数中查询嵌套文档
【发布时间】:2021-11-25 05:50:09
【问题描述】:

我已经挣扎了几个晚上,所以我希望有人可以帮助我,这对我来说听起来并不太复杂。我正在使用来自外部方的 webhook,每次更改帐户时都会触发 Firebase 功能。当它被触发时,它需要搜索和更新相关的 Firebase 对象。

我的数据库结构如下:

- Users (collection)
   - user (document) < Includes the customerId from the webhook
    - Companies (collection)
     - company (document) < Includes the companyId from the webhook

获取相关用户我已经完成:const userRef = db.collection('Users').where('customerId', '==', 'webhook.customerId').get();

这在查询相关用户时有效,但下一步是在集合Companies 中搜索正确的公司文档。这是我卡住的部分。

为了实现这一点,我尝试将它串起来(大声笑),例如:const userRef = db.collection('Users').where('customerId', '==', 'webhook.customerId').doc().collection('Companies').where(etc... etc... 这不起作用。

我也尝试过const companiesRef = db.collectionGroup('Companies').where('companyId', '==', 'webhook.companyId').get();,但这会返回 500 内部服务器错误。

我可以通过什么方式在 Firebase 函数中查询搜索嵌套文档?

【问题讨论】:

  • 您需要获取单个文档才能检索其子集合。 .where 将返回一个查询快照,我认为.doc() 语法用于在创建新文档时生成文档引用。 If no path is specified, an automatically-generated unique ID will be used for the returned DocumentReference
  • 如果您不知道用户的密钥(这就是我假设您使用 where 子句的原因),那么从结果列表中获取第一个也是唯一一个文档。然后像上面一样访问子集合。
  • 感谢您的评论!我找到了一种在 webhook 请求中包含密钥的方法。这似乎是目前唯一的解决方法。您知道如何在搜索相关父文档后返回带有路径的子文档吗?
  • 是的,只需使用 snapshot.forEach。既然你知道只有一场比赛。

标签: node.js firebase google-cloud-firestore google-cloud-functions


【解决方案1】:

您要查找的是collection group query,它允许您查询具有特定名称的所有集合(例如所有Companies 在您的情况下)。

Firestore 查询只能包含它们返回的文档的条件,因此您将无法检查 Users 文档中的 customerId 字段。相反,您需要在每个 Companies 文档中复制 customerId 值,以便将其包含在集合组查询中。

一旦你这样做了,查询就会变成这样:

db.collectionGroup('Companies').where('customerId', '==', '...').where(...).get()

【讨论】:

  • 嗨弗兰克,感谢您的回答,但是:db.collectionGroup('Companies').where('companyId', '==', webhook.companyId).get(); 会触发 catch 而不是 then。 companyId 作为字符串值包含在文档根目录中。
  • 我得到的错误代码是:failed-precondition 顺便说一句
  • 有效!我对 Firebase 的服务器端还很陌生,所以我不知道您应该添加索引。起初我没有在日志中看到错误,所以我在 catch 中添加了functions.logger.error(err)。这包含带有预填充索引的 URL。
  • 是的,许多人忽略了错误消息中的链接,而这是迄今为止添加索引的最简单方法(至少在您了解 Firestore 如何使用索引之前)。很高兴听到你最终成功了?
猜你喜欢
  • 2021-09-05
  • 2018-03-09
  • 2021-07-21
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 2021-02-25
相关资源
最近更新 更多