如何查询多个不同的子集合?

时间:2020-09-21 08:18:22

标签: android firebase google-cloud-firestore

最近我正在构建一个食谱应用程序。我正在使用Firebase作为数据库。现在,我想让用户找到我存储在我的食谱集中的任何食谱。enter image description here

每个Food_Recipe具有不同的子集合。我将通过一个示例来说明我的问题。 enter image description here

现在,我想找到Recipe_name == Biriyani的文档。 我可以使用这种方式轻松归档目标,

  Query query = FirebaseFirestore.getInstance().collection("Recipes").document("Food_Recipe")
            .collection("Rice_Recipe").orderBy("Recipe_name")
            .startAt(InputSearchText).endAt(InputSearchText +"\uf8ff");

但是我需要在Recipe Collection中获得相同的结果。 例如,仅成像,如果Powder_Recipe也有一个Recipe_name Biriyani,则应该有2个来自不同子集的结果。

1 个答案:

答案 0 :(得分:2)

如果要查询多个具有不同名称的(子)集合,则必须对每个集合使用专用查询并合并结果。

如果要避免这种情况,则需要调整数据模型。

我了解到将会有几份Food_Recipe文档,因为您写道“每个Food_Recipe具有不同的子集合”。

例如,在每个subRecipes文档下,您只能有一个Food_Recipe子集合,并且在这个子集合中,可以使powderrice配方之间有所不同文档中的字段(例如,名为recipeType的字段)。这样,您可以使用Collection Group query查询所有subRecipes子集合,如下所示:

Query query = FirebaseFirestore.getInstance().collectionGroup("subRecipes").orderBy("Recipe_name").startAt(InputSearchText).endAt(InputSearchText +"\uf8ff");

请注意,由于您已经有了subRecipes根集合,因此我将这些子集合称为Recipes


如果要获取powder文档的所有Food_Recipe食谱,请按如下所示过滤字段值:

Query query = FirebaseFirestore.getInstance().collection("Recipes").document("Food_Recipe").collection("subRecipes").whereEqualTo("recipeType", "powder");

更具体地说,拟议的数据模型如下

-- Recipes (root collection) 
   -- Food_Recipe_1 (document)
      -- subRecipes (subcollection)
         -- DocID#1 (document)
            - Recipe_Name: Biriyani (field)
            - recipeType: rice (field)             
            - ....  (field)     
         -- DocID#2 (document)
            - Recipe_Name: Peas Pulao (field)
            - recipeType: rice (field)             
            - .... (field)     
         -- DocID#3 (document)
            - Recipe_Name: Powder Recipe (field)
            - recipeType: powder (field)             
            - ....  (field)     
   -- Food_Recipe_2 (document)
      -- subRecipes (subcollection)
         -- DocID#4 (document)
            - Recipe_Name: Another Rice Recipe (field)
            - recipeType: rice (field)             
            - ....  (field)     
         -- DocID#5 (document)
            - Recipe_Name: Another Powder Recipe (field)
            - recipeType: powder (field)             
            - ....  (field)