我需要在Firestore中为文档添加标签。
这些代码由管理员用户创建,每个Tag
都是Tags
集合中的文档。
然后将其中一个或多个标签应用于其他文档,例如Item
个文档。
然后,我们需要能够在Items
中查询包含特定Tag
ID的内容,并使用其他范围过滤器 - 在某个范围内创建日期,按创建日期排序,用户ID匹配特定用户等。
如何构建Item
标记数据以便查询?
如果我有一个预定义数量的允许标记,并将每个标记保存为属性tag1
,tag2
,tag3
等,我可以尝试查询,但不支持OR
...
我可以添加另一个包含一对多关系的集合
ItemTags
,其中包含{itemId, tagId}
,然后先查询以获取Item
ID列表,但同样,我如何再使用该ID列表来过滤Items
收藏?我不想要这个客户端,因为数据会非常大。
更新
标签是分层的,每个级别只能有一个标签。因此,一个可能的选择是在Item
:tag1
,tag2
,tag3
等上使用预定义限制的顶级字段。然后,当创建Item
时,会插入正确的标记级别,当查询它时,我们需要知道用户正在查找哪个级别标记,然后我们可以查询item.tag1 = levelOneTag AND item.tag2 = levelTwoTag
。
不理想,因为它限制了水平,但我很确定10会覆盖它。
答案 0 :(得分:1)
我要做的是在每个标签上都有一个子集合,并带有所有具有该特定标签的文档ID。每个文档上还有一个子集合,列出了该文档具有的所有标签。
我最近在NoSQL和Firestore中发现的是,它非常快速且具有可伸缩性,并且尺寸较小,因此您需要花费更多时间进行更新。
我通常使用带有Firebase函数的触发器来执行此操作。例如,您可以在将标签添加/修改/删除到文档子集合中时添加侦听器,并在该特定标签子集合中更新或删除该文档ID。 (ID或您需要过滤的其他任何字段)
请参见https://firebase.google.com/docs/functions/firestore-events
这样,您就没有太多的客户端逻辑,并且后端中的所有内容都易于维护。