是否可以提取其子集合包含特定文档ID的所有文档?

时间:2020-04-29 11:01:27

标签: firebase flutter dart google-cloud-firestore

我正在尝试获取其子集合包含特定文档ID的所有文档。有什么办法吗?

例如,如果存在“查询”子集合下的带框文件,那么我需要“书”集合中的带框文件ID。我不知道如何向后获取父文档ID。

Structure of my database

3 个答案:

答案 0 :(得分:1)

尝试以下操作:

Firestore.instance.collection("books").where("author", isEqualTo: "Arumugam").getDocuments().then((value) {
  value.documents.forEach((result) {
   var id = result.documentID;
   Firestore.instance.collection("books").document(id).collection("enquiries").getDocuments().then((querySnapshot) {
    querySnapshot.documents.forEach((result) {
      print(result.data);
    });

首先,您需要检索books集合下的ID,然后才能进行查询,例如where("author", isEqualTo: "Arumugam")。检索id后,您可以进行查询以检索集合enquiries

中的文档

答案 1 :(得分:1)

我假设所有子集合都具有相同的名称,即enquiries。然后,您可以执行以下操作:

  1. docId文档中添加包含文档ID的字段enquiries
  2. 执行Collection Group query,以获取具有所需docId值(Firestore.instance.collectionGroup("enquiries").where("docId", isEqualTo: "ykXB...").getDocuments())的所有文档。
  3. 然后,您遍历查询结果,并为每个DocumentReference调用两次parent()方法(first time您将得到CollectionReference和{{3 }},您将获得上级文档的DocumentReference
  4. 您只需要使用second time属性就可以了。

答案 2 :(得分:0)

例如,如果存在“查询”子集合下的带框文件,那么我需要“书”集合中的带框文件ID。

您不可能一次完成该操作。

我不知道如何向后获取父文档ID。

您可能一直在想,Firestore中没有回头路可走了。在Firebase实时数据库中,我们有一个名为getParent()的方法,该方法完全可以满足您的要求,但在Firestore中,我们不需要。

Firestore中的查询很浅,这意味着它仅从运行查询的集合中获取项目。 Firestore不一次性支持跨不同集合的查询。单个查询只能使用单个集合中的文档属性。因此,解决问题的方法是执行两个get()调用。第一个方法是检查该文档在enquiries子集合中是否存在,如果存在,只需创建另一个get()调用即可从books集合中获取该文档。