最近我正在构建一个食谱应用程序。我正在使用Firebase作为数据库。现在,我想让用户找到我存储在我的食谱集中的任何食谱。
每个Food_Recipe具有不同的子集合。我将通过一个示例来说明我的问题。
现在,我想找到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个来自不同子集的结果。
答案 0 :(得分:2)
如果要查询多个具有不同名称的(子)集合,则必须对每个集合使用专用查询并合并结果。
如果要避免这种情况,则需要调整数据模型。
我了解到将会有几份Food_Recipe
文档,因为您写道“每个Food_Recipe具有不同的子集合”。
例如,在每个subRecipes
文档下,您只能有一个Food_Recipe
子集合,并且在这个子集合中,可以使powder
和rice
配方之间有所不同文档中的字段(例如,名为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)