我需要向 Firestore 中的文档添加标签。
这些标签由管理员用户创建,每个Tag
都是Tags
集合中的一个文档。
然后将这些标签中的一个或多个应用于其他文档,例如 Item
文档。
然后,我们需要能够查询 Items
中包含特定 Tag
id 的项目,并具有其他范围过滤器 - 在某个范围内创建的日期、排序依据创建日期、用户 ID 与特定用户匹配等。
如何构建 Item
标签数据以便可以查询?
- 无法查询数组属性,因此不起作用。
- map 或集合必须预先编制索引,这也不能用作其动态数据。
如果我有预定义数量的允许标签,并将每个标签保存为属性,
tag1
、tag2
、tag3
等等,我可以尝试查询,但不支持OR
...我可以添加另一个包含一对多关系的集合
- 假设
ItemTags
具有{itemId, tagId}
,然后首先查询它以获取Item
id 列表,但再次,然后如何使用该 id 列表来过滤Items
集合?
- 假设
我不想要这个客户端,因为数据会非常大。
更新:
标签是分层的,每一级只能有一个标签。因此,一种可能的选择是在 Item
上设置顶级字段:tag1
、tag2
、tag3
等,并带有预先定义的限制。然后,当创建 Item
时,会插入正确的标签级别,并且在查询时,我们需要知道用户正在查找哪个级别标签,然后我们可以查询 item.tag1 = levelOneTag AND item.tag2 = levelTwoTag
。
不太理想,因为它限制了级别,但我很确定 10 级就可以覆盖它。
最佳答案
我要做的是在每个标签上都有一个子集合,其中包含具有该特定标签的所有文档 ID。还有每个文档的子集合,列出该文档具有的所有标签。
我最近发现 NoSQL 和 Firestore 速度非常快且可扩展,并且可以减少您需要在更新上花费更多时间的情况。
我通常使用带有 firebase 函数的触发器来执行此操作。例如,您可以在文档子集合中添加/修改/删除标签时添加监听器,并更新或删除该特定标签子集合中的文档 ID。 (ID 或您需要过滤的任何其他字段)
参见https://firebase.google.com/docs/functions/firestore-events
这样你就没有那么多的客户端逻辑,并且你在后端拥有更容易维护的所有内容。
关于Firebase Firestore : how to store and query One to Many relationships?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48500441/