【问题标题】:Need advice for how to structure my data in Firestore需要有关如何在 Firestore 中构建数据的建议
【发布时间】:2022-01-09 12:06:21
【问题描述】:

所以我正在尝试为我的用例找出最佳结构。

目前看起来是这样的

salesItems | userId | salesItem1 | 
                    | salesItem2 | and so on.

因此,这些项目存储在以相应用户 ID 命名的文档中。

问题是,我希望这个文档大于 1MB。

所以我想也许我需要设置集合组查询。

因此我建立了这样的结构:

salesItems | userId | StoreA | documentId | startDate: 
                                          | endDate: 
                                          | salesItems:

                    | StoreB | documentId | startDate:

项目作为块存储在文档中的位置,将开始日期和结束日期作为字段,以便可以按日期查询这些块。

所以一个文档应该是这样的:

 startDate: 01/01/2021
 endDate:   12/31/2021
 salesItems:[items]

我的目标是为用户查询所有商店中的所有文档。

所以我的问题是:

  1. 您认为有更好的解决方案吗?
  2. 如果您还认为我应该使用集合组查询, 什么是正确的安全规则?

在观看了tutorial关于集合组查询的fireships之后,似乎集合组查询需要特殊的安全规则。

目前我正在写作:

match /salesItems/{userId}/{documents=**} {
  allow read, write: if true; //No restriction for testing purposes.
}

但这不起作用。

这是当前结构的截图。

注意我需要将物品存放在 2 盒子中。我打算删除 1 行,但这不是问题的一部分。

这是我想出的子集合结构:

【问题讨论】:

  • 您能否通过示例文档的屏幕截图阐明结构(每个集合中存储的确切内容)?术语有点混乱,例如 salesItems 集合包含带有 userId 的文档,然后在子文档中再次包含 salesItems。
  • 我已经上传了截图。
  • 只是为了了解数据。是不是像 - 有用户,他们每个人都可以有多个商店,然后每个商店都有自己的商品(salesItems)?
  • 差不多,是的。
  • 我已经添加了另一个屏幕截图,其中包含我正在考虑的子集合结构

标签: firebase google-cloud-firestore nosql firebase-security


【解决方案1】:

对于商店和商品数据,您可以尝试如下构建数据库:

users -> {userId}
(col)     (doc)

stores -> {storeId} -> items -> {itemId}
(col)       (doc)      (col)     (doc)

您可以在每个商店文档中存储一个字段 ownerId 以引用拥有该商店的用户(如果一个商店可以有多个所有者,则可以是一组 UID)。

通过这种方式,您可以使用 CollectionGroup 查询来查询来自特定商店的商品以及商品文档中任何属性的商品 ID。


我不确定您对这些集合需要什么权限,但对于集合组查询,您可以按如下所示构造它们:

rules_version = '2';
service cloud.firestore {

  match /databases/{database}/documents {
    // Allow anyone to read items
    match /{path=**}/items/{itemId} {
      allow read: if request.auth != null;
    }

    // Allow users to read but owner to write store
    match /stores/{storeId} {
      allow write: if request.auth.uid == resource.data.owner;
      allow read: if request.auth != null;
    }
  }
}

此外,items 子集合也可以是根级集合。然后,您还必须添加一个包含 storeId 的字段,但随后就无需使用 CollectionGroup 查询。


编辑:

由于每个商店都可以有自己的数据,因此可以使用以下结构:

users -> {userId} -> stores -> {storeId} -> items -> {itemId}
(col)     (doc)       (col)       (doc)      (col)     (doc)

您现在为每个用户都有一个商店文档,有关该商店的任何信息都可以存储在商店文档中。虽然 items 可以是原始问题中提到的数组,但如果存储在子集合中,查询它们可能会更容易,因为 Firestore 中没有类似 unwind 的功能。

【讨论】:

  • 好吧,我开始明白一点了。但是有一点我没有说清楚:每个用户都有自己的商店“实例”。我正在使用用户帐户的 API 从特定商店收集数据。例如:我正在登录用户 Shopify 帐户并从那里获取数据。因此,永远不会有 2 个用户可以访问同一个商店“实例”。那我还需要在文档中存储ownerId吗?
  • @Christian 如果我理解正确,那么假设有一个商店 StoreA 和 2 个用户 - user1 和 user2。他们都可以有一个与 StoreA 关联的文档吗?喜欢 StoreAUser1 和 StoreAUser2?
  • 我正在为我在 StoreA 和 StoreB 的用户帐户抓取数据。所以 user1 给了我他的 StoreA 凭据,我正在为他的帐户抓取数据,并将其存储在 salesItems - userId1 - StoreA 下彼此做。
  • @Christian 我已经更新了答案,你能检查一下吗?
  • 这个结构看起来很完美。但是,我可以查询所有商店的商品吗?
猜你喜欢
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多