【问题标题】:Retrieve multiple items in Firestore在 Firestore 中检索多个项目
【发布时间】:2019-06-16 12:50:26
【问题描述】:

我在 Firestore 中有以下数据结构:

{
  items: [
    itemId1: {},
    itemId2: {},
    itemId3: {}
  ],
  users: [
    userId1: {
      itemIds: [
        "itemId1",
        "itemId3"
      ]
    }
  ]
}

这种数据结构的目标是让许多用户能够访问和协作处理相同的项目。因此,将这些项目移动到每个用户中将是相当低效和困难的。

如果我有 userId (userId1),我想查询用户 itemIds 数组中的所有项目的项目集合。

因此,在本例中,它将返回 [itemId1: {}, itemId3: {}]。

我的应用程序是一个使用 Angular (7.2.1) 和 Angularfire 的应用程序。

如果我的数据结构本身存在缺陷,请告诉我,我可以尝试更改它们。

提前谢谢。

【问题讨论】:

  • 按照你现在的方式,你不能在一个查询中做到这一点。事实上,您需要为用户及其项目列表执行一次 get(),然后为列表中找到的每个项目执行另一次 get()。 (换句话说,Firestore 中没有类似“SQL 连接”的功能。)
  • 对于这样的协作应用程序是否有任何推荐的数据设计模式?
  • 我认为这取决于您希望 UI 的操作方式。当我有一个共享的事物池时,我会执行其中的一些操作,但用户一次只能编辑一件事。例如,如果一个团队有 5 个用户和 3 场比赛,我将所有 5 个用户非规范化到团队中,以及 3 场比赛。当我非规范化时,我决定哪些字段很重要。所以对于用户来说,是他们的名字、身份证,也许还有他们的号码和职位。对于游戏,它是日期/时间、对手名称、简单位置、ID。在 Firestore 中效率低下之前,您可以在文档中保存多达 1MB 的数据,但请注意没有保存限制

标签: angular firebase google-cloud-firestore


【解决方案1】:
this.afs.doc('users/' + userId1).valueChanges().subscribe(itemIds=>{
  itemIds.forEach(itemId=>{
    this.afs.doc<Item>('items/'+ itemId).valueChanges().subscribe(item=> {
      console.log(item);
    });
  })
});

你可以试试这个。 第一个 afs.doc 从 users 集合中检索 itemId 数组 forEach 遍历所有 itemIds 并对文档 ID 为 _itemId

的 items 集合进行另一个 firestore 查询

我还没有运行代码。但它应该清楚如何查询此类结构的想法。希望能回答你的问题

【讨论】:

    猜你喜欢
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2020-11-23
    • 2021-07-15
    • 1970-01-01
    相关资源
    最近更新 更多