如何搜索包含标识文档字段的未知集合?

时间:2019-05-23 12:28:01

标签: java android firebase google-cloud-firestore

是否可以搜索包含文档的未知集合,该文档具有诸如电子邮件之类的标识字段?

我的结构是这样的:

每个用户都基于唯一的ID获得自己的收藏集。每个集合包含一个用户文档和一个帐户文档。用户文档包含有关我要搜索的用户的信息。帐户文档包含我要在用户之间转移资金的银行帐户的集合。

我的问题是,我不希望用户键入唯一的长ID来输入集合,而是希望键入集合\用户文档中的用户电子邮件。电子邮件是唯一的。

我刚刚为我的项目构建了不好的结构,还是可以做些什么?

My Structure

更新
感谢AlexFrank的反馈。 我继续并将结构更改为如下所示:
/users/$uid/accounts/$accountid

做了java Query collectionReference = db.collection("users").whereEqualTo("uEmail", userEmail);并将document.getId()保存为String userId

然后,我在UserId中使用spinner,以使用户能够从userId帐户集中选择一个帐户。

2 个答案:

答案 0 :(得分:2)

  

是否可以搜索包含文档的未知集合,该文档具有诸如电子邮件之类的标识字段?

否,您应该知道您收藏的名称,以便能够在参考中使用它。 Cloud Firestore集合/文档的路径中没有通配符。您必须通过它们的特定ID来识别每个集合和每个文档。

答案 1 :(得分:2)

正如Alex所说,除非您知道集合名称,否则无法从集合(使用客户端SDK)加载数据。

但是在这种情况下,您的集合似乎是以用户的UID命名的。

这意味着,如果用户已登录,则可以通过以下方式了解他们的收藏集:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
CollectionReference userCollection = FirebaseFirestore.getInstance().collection(uid);

一些注意事项:

  • 惯用的做法是,将结构与顶层users集合一起存储,然后为该文件下的每个用户存储一个文档,然后在该子目录下的下存储其他数据的子集合。 >。例如:/users/$uid/accounts/$accountid
  • 服务器端SDK do 具有获取集合列表的方法,例如listCollections method in the Node.js SDK。但是,这些SDK仅可在受信任的环境中使用,例如开发机器,您控制的服务器或Cloud Functions,而不能直接在客户端上使用。即使使用此SDK,您也必须迭代集合列表并依次检查每个集合,因为如前所述:您只能从知道名称的集合中读取数据。
  • 如果您要查找的用户/登录ID不同于登录该应用程序的用户,则可能需要将电子邮件地址映射到UID的方法。客户端SDK中不提供此类功能。但是与上述要点类似,有一种方法getUserByEmail in the Admin SDKs