需要有关如何在 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]
我的目标是为用户查询所有商店的所有文档。
所以我的问题是:
- 您认为有更好的解决方案吗?
- 如果你也认为我应该去收集组查询,
正确的安全规则是什么?
在查看 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
的功能。
所以我正在尝试找出适合我的用例的最佳结构。
目前是这样:
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]
我的目标是为用户查询所有商店的所有文档。
所以我的问题是:
- 您认为有更好的解决方案吗?
- 如果你也认为我应该去收集组查询, 正确的安全规则是什么?
在查看 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
的功能。