我正在做一个管理 Jmeter 板。我想显示所有用户的详细信息和他们的订单。当我想获取用户集合中的所有文档时,它返回空。更多信息在用户集合中,每个文档都有一些子集合。在帐户子集合中,有一个文档存在名称详细信息,其中用户帐户详细信息如快照所示。
我的代码是
export function getUsers() { return firebase.firestore().collection("users").get(); }
bfhwhh0e1#
如果你直接将用户的详细信息存储在文档中而不是“account”子集合中,那么提取“users”集合将返回所有用户的文档和他们的数据。如果你说没有理由,那么我建议这样做。另一个选择是对“account”使用collectionGroup查询,它将从命名为“account”的子集合中获取所有文档,即为您提供每个用户的帐户详细信息。
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。
id
btxsgosb2#
Firestore查询只访问单个集合或具有特定名称的所有集合。无法基于另一个集合中的值来查询集合。最常见的选项有:1.首先查询父集合,然后检查每个文档的子集合。如果父集合中的误报相对较少,则此方法效果最佳。1.使用集合组查询查询所有子集合,然后检查每个结果的父文档。如果子集合查询中的误报相对较少,则此方法效果最佳。1.将子文档中的相关信息复制到父文档中,然后基于该信息查询父集合。例如,可以在用户文档中添加hasOrders字段或orderCount。这种方法在查询时始终可以提供最佳结果,但需要修改编写数据的代码以适应这种情况。第三种方法通常是可伸缩解决方案的最佳选择。如果你有关系数据库的背景,这种数据重复可能看起来很不自然,但实际上在NoSQL数据库中非常常见,你经常不得不更改数据模型以允许应用所需的查询。要了解更多关于这方面的信息,我建议阅读NoSQL data modeling并观看Getting to know Cloud Firestore。
hasOrders
orderCount
2条答案
按热度按时间bfhwhh0e1#
如果你直接将用户的详细信息存储在文档中而不是“account”子集合中,那么提取“users”集合将返回所有用户的文档和他们的数据。如果你说没有理由,那么我建议这样做。
另一个选择是对“account”使用
collectionGroup
查询,它将从命名为“account”的子集合中获取所有文档,即为您提供每个用户的帐户详细信息。这里,
id
是用户的文档ID。btxsgosb2#
Firestore查询只访问单个集合或具有特定名称的所有集合。无法基于另一个集合中的值来查询集合。
最常见的选项有:
1.首先查询父集合,然后检查每个文档的子集合。如果父集合中的误报相对较少,则此方法效果最佳。
1.使用集合组查询查询所有子集合,然后检查每个结果的父文档。如果子集合查询中的误报相对较少,则此方法效果最佳。
1.将子文档中的相关信息复制到父文档中,然后基于该信息查询父集合。例如,可以在用户文档中添加
hasOrders
字段或orderCount
。这种方法在查询时始终可以提供最佳结果,但需要修改编写数据的代码以适应这种情况。第三种方法通常是可伸缩解决方案的最佳选择。如果你有关系数据库的背景,这种数据重复可能看起来很不自然,但实际上在NoSQL数据库中非常常见,你经常不得不更改数据模型以允许应用所需的查询。
要了解更多关于这方面的信息,我建议阅读NoSQL data modeling并观看Getting to know Cloud Firestore。