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

Java 如何搜索包含标识文档字段的未知集合?,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,是否可以搜索包含具有标识字段(如电子邮件)的文档的未知集合 我的结构是这样的: 每个用户根据唯一ID获取自己的集合。每个集合包含一个用户文档和一个帐户文档。User doc包含我要搜索的用户的相关信息。账户文档包含我要在用户之间转账的银行账户集合 我的问题是,我不希望用户键入长的唯一id以进入集合,而是要键入集合\用户文档中用户的电子邮件。这封电子邮件是独一无二的 我是否为我的项目建立了一个糟糕的结构,或者我能做些什么 更新 谢谢,谢谢你的反馈。 我接着将结构更改为如下所示: /users/

是否可以搜索包含具有标识字段(如电子邮件)的文档的未知集合

我的结构是这样的:

每个用户根据唯一ID获取自己的集合。每个集合包含一个用户文档和一个帐户文档。User doc包含我要搜索的用户的相关信息。账户文档包含我要在用户之间转账的银行账户集合

我的问题是,我不希望用户键入长的唯一id以进入集合,而是要键入集合\用户文档中用户的电子邮件。这封电子邮件是独一无二的

我是否为我的项目建立了一个糟糕的结构,或者我能做些什么



更新
谢谢,谢谢你的反馈。 我接着将结构更改为如下所示:
/users/$uid/accounts/$accountid


做了一个
java查询collectionReference=db.collection(“用户”).whereEqualTo(“uEmail”,userEmail)
并将
文档.getId()保存为
字符串userId

然后,我在
微调器中使用
UserId
,使用户能够从
UserId
accounts集合中选择一个帐户

是否可以搜索包含具有标识字段(如电子邮件)的文档的未知集合

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

是否可以搜索包含具有标识字段(如电子邮件)的文档的未知集合


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

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

但在本例中,您的集合似乎是以用户的UID命名的

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

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
CollectionReference userCollection = FirebaseFirestore.getInstance().collection(uid);
请注意:

  • 更惯用的做法是,将您的结构存储为一个顶级的
    用户集合
    ,然后为该集合下的每个用户存储一个文档,然后为该集合下的其他数据存储子集合。例如:
    /users/$uid/accounts/$accountid
  • 服务器端SDK确实有一个获取集合列表的方法,例如如下所示。但这些SDK只能在可信环境中使用,例如您的开发机器、您控制的服务器或云功能,而不能直接在客户端上使用。但是,即使使用此SDK,您也必须迭代集合列表并依次检查每个集合,因为如前所述:您只能从已知名称的集合中读取数据
  • 如果您试图查找集合/UID以查找登录到应用程序的用户以外的其他用户,您可能需要找到将电子邮件地址映射到UID的方法。这种功能在客户端SDK中不可用。但与上面的观点类似,有一种方法

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

但在本例中,您的集合似乎是以用户的UID命名的

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

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
CollectionReference userCollection = FirebaseFirestore.getInstance().collection(uid);
请注意:

  • 更惯用的做法是,将您的结构存储为一个顶级的
    用户集合
    ,然后为该集合下的每个用户存储一个文档,然后为该集合下的其他数据存储子集合。例如:
    /users/$uid/accounts/$accountid
  • 服务器端SDK确实有一个获取集合列表的方法,例如如下所示。但这些SDK只能在可信环境中使用,例如您的开发机器、您控制的服务器或云功能,而不能直接在客户端上使用。但是,即使使用此SDK,您也必须迭代集合列表并依次检查每个集合,因为如前所述:您只能从已知名称的集合中读取数据
  • 如果您试图查找集合/UID以查找登录到应用程序的用户以外的其他用户,您可能需要找到将电子邮件地址映射到UID的方法。这种功能在客户端SDK中不可用。但与上面的观点类似,有一种方法

我是否可以使用一个微调器来选择我的所有收藏并将用户电子邮件显示为文本,无论用户选择什么,微调器都可以获得收藏/文档路径?是的,您可以,但这意味着一旦您获得所有收藏并选择一个特定的收藏,您应该发出另一个请求以获取所需的数据。我是否可以使用一个微调器来选择我的所有收藏并将用户电子邮件显示为文本,以及用户选择的任何内容,微调器都可以获取收藏/文档路径?是的,您可以,但这意味着一旦您获得所有收藏并选择一个特定的收藏,你应该提出另一个请求以获得所需的数据。总是比我的答案更深入感谢Alex的赞美,尽管我完全不同意那句话中的“总是”。)谢谢你,帕夫:)我真的很感激。总是比我的答案更深入谢谢你对亚历克斯的赞美,尽管我完全不同意那句话中的“总是”。)谢谢你,普夫:)我真的很感激。