【问题标题】:Firebase Firestore : how to store and query One to Many relationships?Firebase Firestore:如何存储和查询一对多关系?
【发布时间】:2018-07-08 02:24:17
【问题描述】:

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

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

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

然后,我们需要能够在 Items 中查询包含特定 Tag id 的那些,并具有其他范围过滤器 - 在范围内创建日期、按创建日期排序、用户 id 匹配特定用户等.

如何构造Item 标签数据以便查询?

  • 无法查询 Array 属性,因此无法使用。
  • 地图或集合必须预先编制索引,这也不能用作其动态数据。
  • 1234563不支持...
  • 我可以添加另一个包含一对多关系的集合

    • ItemTags,有{itemId, tagId},然后先查询它以获取Item ids 的列表,但同样,我如何使用该ids 列表来过滤Items 集合?

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

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

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

【问题讨论】:

  • 一般来说,对于 NoSQL 数据库,如果某个数据模型无法满足您的用例,请修改或扩充该模型,使其允许您的用例。当涉及到项目的分类时,您通常会得到一个反向“索引”:您可以在其中查找特定类别的项目(或项目 ID)的集合。另见stackoverflow.com/a/41528908stackoverflow.com/a/40657455。虽然两者都是为实时数据库编写的,但主体也适用于 Cloud Firestore。
  • 我目前正在查看完全相同的用例?你有没有找到解决方案?
  • 不,不是。最后我们只是映射了数据客户端,远非理想,但却是最合适的解决方案。

标签: firebase google-cloud-firestore


【解决方案1】:

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

我最近对 ​​NoSQL 和 Firestore 的发现是,它非常快速且可扩展,而且您需要花费更多时间进行更新。

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

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

这样您就没有那么多客户端逻辑,并且您在后端拥有更易于维护的所有内容。

【讨论】:

    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 2017-03-16
    • 2018-03-19
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多