需要有关如何在 Firestore 中构建我的数据的建议

Need advice for how to structure my data in Firestore

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

目前是这样:

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. 如果你也认为我应该去收集组查询, 正确的安全规则是什么?

在查看 fireships tutorial 收集组查询后,收集组查询似乎需要特殊的安全规则。

目前我正在写:

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

但这不起作用。

这是当前结构的屏幕截图。

注意 我需要将项目存储在 2 框中。我打算删除 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 的功能。