Firebase Firestore:如何存储和查询一对多关系?

时间:2018-01-29 11:41:52

标签: firebase google-cloud-firestore

我需要在Firestore中为文档添加标签。

这些代码由管理员用户创建,每个Tag都是Tags集合中的文档。

然后将其中一个或多个标签应用于其他文档,例如Item个文档。

然后,我们需要能够在Items中查询包含特定Tag ID的内容,并使用其他范围过滤器 - 在某个范围内创建日期,按创建日期排序,用户ID匹配特定用户等。

如何构建Item标记数据以便查询?

  • 无法查询Array属性,因此无法工作。
  • 必须预先制作地图或集合,这也不会作为其动态数据。
  • 如果我有一个预定义数量的允许标记,并将每个标记保存为属性tag1tag2tag3等,我可以尝试查询,但不支持OR ...

  • 我可以添加另一个包含一对多关系的集合

    • ItemTags,其中包含{itemId, tagId},然后先查询以获取Item ID列表,但同样,我如何再使用该ID列表来过滤Items收藏?

我不想要这个客户端,因为数据会非常大。

更新 标签是分层的,每个级别只能有一个标签。因此,一个可能的选择是在Itemtag1tag2tag3等上使用预定义限制的顶级字段。然后,当创建Item时,会插入正确的标记级别,当查询它时,我们需要知道用户正在查找哪个级别标记,然后我们可以查询item.tag1 = levelOneTag AND item.tag2 = levelTwoTag

不理想,因为它限制了水平,但我很确定10会覆盖它。

1 个答案:

答案 0 :(得分:1)

我要做的是在每个标签上都有一个子集合,并带有所有具有该特定标签的文档ID。每个文档上还有一个子集合,列出了该文档具有的所有标签。

我最近在NoSQL和Firestore中发现的是,它非常快速且具有可伸缩性,并且尺寸较小,因此您需要花费更多时间进行更新。

我通常使用带有Firebase函数的触发器来执行此操作。例如,您可以在将标签添加/修改/删除到文档子集合中时添加侦听器,并在该特定标签子集合中更新或删除该文档ID。 (ID或您需要过滤的其他任何字段)

请参见https://firebase.google.com/docs/functions/firestore-events

这样,您就没有太多的客户端逻辑,并且后端中的所有内容都易于维护。