【问题标题】:How to fetch all documents from a firebase collection where each document has some sub collection and in sub collection there is a document?如何从firebase集合中获取所有文档,其中每个文档都有一些子集合并且在子集合中有一个文档?
【发布时间】:2021-10-30 01:51:00
【问题描述】:

我正在制作一个管理仪表板。我想显示所有用户的详细信息和他们的订单。当我想获取用户集合中的所有文档时,它返回空。更多在用户集合中,每个文档都有一些子集合。在帐户子集合中有一个文档存在名称详细信息,其中用户帐户详细信息可用,如快照所示。 我的代码是

export function getUsers() { 
  return firebase.firestore().collection("users").get();
}

【问题讨论】:

  • 是否有任何理由不将用户的详细信息存储在用户文档本身而不是使用子集合?
  • 没有特殊原因不在用户文档中存储用户详细信息。
  • 如果您将用户的详细信息存储在文档本身而不是 'accoun'' 子集合中,那么您将在运行查询时获得该数据。如果您说没有理由,那么我建议您这样做。
  • 是的。但是在我的颤振应用程序中,我保存了这样的用户详细信息,现在获取所有用户详细信息太复杂了...
  • 好的...谢谢

标签: node.js reactjs firebase google-cloud-firestore


【解决方案1】:

如果您将用户的详细信息直接存储在文档中而不是“帐户”子集合中,则获取“用户”集合将返回所有用户的文档及其数据。如果您说没有理由,那么我建议您这样做。

其他选项是在“帐户”上使用collectionGroup 查询,这将从名为“帐户”的子集合中获取所有文档,即为您提供每个用户的帐户详细信息。

const snap = await db.collectionGroup('account').get()
const users = snap.docs.map(d => ({id: doc.ref.parent.parent.id, data: d.data()))

这里,id 是用户的文档 ID。

【讨论】:

    【解决方案2】:

    Firestore 查询仅访问单个集合,或具有特定名称的所有集合。无法根据另一个集合中的值查询一个集合。

    最常见的选项是:

    1. 首先查询父集合,然后检查每个文档的子集合。如果父集合中的误报相对较少,这种方法效果最好。
    2. 使用collection group query 查询所有子集合,然后检查每个结果的父文档。如果您的子集合查询中的误报相对较少,这种方法效果最好。
    3. 将子文档中的相关信息复制到父文档中,然后据此查询父集合。例如,您可以在用户文档中添加hasOrders 字段或orderCount。这种方法在查询时始终提供最佳结果,但需要您修改写入数据的代码以适应。

    第三种方法通常最适合可扩展的解决方案。如果您有关系数据库背景,这种数据重复可能看起来不自然,但实际上在 NoSQL 数据库中很常见,您经常需要更改数据模型以允许应用程序需要的查询。

    要了解更多信息,我建议阅读NoSQL data modeling 和观看Getting to know Cloud Firestore

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-16
      • 2019-09-28
      • 2021-06-29
      • 2020-01-22
      • 2020-08-15
      • 1970-01-01
      • 2021-01-23
      • 2019-02-05
      相关资源
      最近更新 更多