NodeJS Firebase Cloud Function是否支持通配符集合名称?

nhhxz33t  于 2023-02-18  发布在  Node.js
关注(0)|答案(2)|浏览(127)

我正在尝试用Firestore支持Firebase中的多个客户端。对于一个集合,每个公司都有一个副本。例如,每个公司都有这样一个集合“表单”:(前缀+集合名称)
_c_companyABC_forms
_c_companyXYZ_forms
_c_companyAnyName_forms
...
可能有10-20家公司,但他们都有相同的数据库结构,我只是用前缀来区分他们。
Firebase Cloud Function是否有办法能够监听上述所有集合的文档更改?我还可以从路径中提取公司名称,如下所示(其中我使用 * 作为伪代码,以指示该集合名称中的任何名称)

exports.formChangeTask = functions.firestore
  .document('_c_*_forms/{formId}')
  .onWrite(async (change, context) => {
      
     const path = context.resource.name.split('/');
     const collectionName = path[0];
     const companyShortName = collectionName.split('_')[2];
}
a5g8bdjr

a5g8bdjr1#

为什么不创建一个简单的没有前缀的form集合,并在那里收集他们所有的文档呢?或者创建一个公司集合,并将文档分配给文档的form子集合呢?
您正在尝试添加额外的,无用的复杂性到您的数据库。如果您想通过一个客户端扩展数据库,您将需要添加每次额外的安全规则由您自己或创建额外的复杂函数,将为您做它每次新的客户端不提,你将需要以某种方式跟踪所有这些集合名称,因为只有管理SDK可以获得集合名称列表。
试着把集合名想象成常规数据库中的表名。

x4shl7ld

x4shl7ld2#

我能想到的最简单的数据库模式是将所有公司添加到一个单一集合中,结构如下:

db
|
--- companies (collection)
     |
     --- $companyId (document)
           |
           --- name: "ABC"

通过这种方式,您可以根据需要获取数据库中的所有公司。您还可以使用where('name', '==', 'ABC')仅获取具有特定名称的公司。但是,如果您需要向每个公司添加一些表单,则只需在每个公司文档下添加一个子集合,在这种情况下,数据库架构应如下所示:

db
|
--- companies (collection)
     |
     --- $companyId (document)
           |
           --- name: "ABC"
           |
           --- forms (collection)
                |
                --- $formId (document)
                     |
                     --- name: "Any"

通过这种方式,您可以始终查询以获取特定公司的所有表单,并使用收集组查询来获取所有公司的所有表单。

相关问题