如何从一个firebase集合中获取所有文档,其中每个文档都有一些子集合,并且在子集合中有一个文档?

ddrv8njm  于 2022-11-17  发布在  其他
关注(0)|答案(2)|浏览(235)

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


我的代码是

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

bfhwhh0e1#

如果你直接将用户的详细信息存储在文档中而不是“account”子集合中,那么提取“users”集合将返回所有用户的文档和他们的数据。如果你说没有理由,那么我建议这样做。
另一个选择是对“account”使用collectionGroup查询,它将从命名为“account”的子集合中获取所有文档,即为您提供每个用户的帐户详细信息。

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

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

btxsgosb

btxsgosb2#

Firestore查询只访问单个集合或具有特定名称的所有集合。无法基于另一个集合中的值来查询集合。
最常见的选项有:
1.首先查询父集合,然后检查每个文档的子集合。如果父集合中的误报相对较少,则此方法效果最佳。
1.使用集合组查询查询所有子集合,然后检查每个结果的父文档。如果子集合查询中的误报相对较少,则此方法效果最佳。
1.将子文档中的相关信息复制到父文档中,然后基于该信息查询父集合。例如,可以在用户文档中添加hasOrders字段或orderCount。这种方法在查询时始终可以提供最佳结果,但需要修改编写数据的代码以适应这种情况。
第三种方法通常是可伸缩解决方案的最佳选择。如果你有关系数据库的背景,这种数据重复可能看起来很不自然,但实际上在NoSQL数据库中非常常见,你经常不得不更改数据模型以允许应用所需的查询。
要了解更多关于这方面的信息,我建议阅读NoSQL data modeling并观看Getting to know Cloud Firestore

相关问题