Firebase Firestore : how to store and query One to Many relationships?

标签 firebase google-cloud-firestore

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

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

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

然后,我们需要能够查询 Items 中包含特定 Tag id 的项目,并具有其他范围过滤器 - 在某个范围内创建的日期、排序依据创建日期、用户 ID 与特定用户匹配等。

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

  • 无法查询数组属性,因此不起作用。
  • map 或集合必须预先编制索引,这也不能用作其动态数据。
  • 如果我有预定义数量的允许标签,并将每个标签保存为属性,tag1tag2tag3 等等,我可以尝试查询,但不支持 OR...

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

    • 假设 ItemTags 具有 {itemId, tagId},然后首先查询它以获取 Item id 列表,但再次,然后如何使用该 id 列表来过滤 Items 集合?

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

更新: 标签是分层的,每一级只能有一个标签。因此,一种可能的选择是在 Item 上设置顶级字段:tag1tag2tag3 等,并带有预先定义的限制。然后,当创建 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/

相关文章:

java - 如何返回 DocumentSnapShot 作为方法的结果?

Firebase Admob 广告即使在一个月后也没有显示,广告无法加载

android - 向 Firebase DB 添加新字段时的向后兼容性

android - 像地理围栏一样使用 geofire

javascript - Firebase 云功能/Firestore

firebase - 从firestore中获取用户数据,并使用flutter在配置文件屏幕中显示用户数据

javascript - Firebase - 从数据库 Node 获取随机子 Node

Angular Firebase 调用作为服务

javascript - 在 firebase 云函数中的集合名称中使用空格时出错

android - 迁移 Firestore 替换字段