Firestore合并多集合组查询:如何获取符合卡路里条件的所有餐次食品
解决方案
方案1:调整数据库结构(更简洁,长期易维护)
你无法用单次集合组查询覆盖三个餐次的核心原因是三个餐次的集合名称不统一,集合组查询的规则是匹配全库所有和指定名称完全一致的集合。
调整方式:
- 将原有的
Breakfast/Lunch/Dinner集合统一重命名为meals - 在每个食品文档中新增
meal_type字段,值对应为breakfast/lunch/dinner用来区分餐次类型
调整后单次查询即可获取所有符合条件的食品:
const lowCalQuery = query( collectionGroup(db, 'meals'), where('calories', '<', 500) ); const querySnapshot = await getDocs(lowCalQuery); const result = querySnapshot.docs.map(doc => doc.data());
注意:如果你的
calories字段存储的是数字类型,查询条件里的数值不要加引号,直接写数字即可,避免类型不匹配导致的查询结果错误。
如果后续需要筛选特定餐次的食品,仅需追加where('meal_type', '==', 'breakfast')条件即可。
方案2:不改动现有结构,合并多查询结果
如果不想调整现有数据结构,可以并行执行三个餐次的集合组查询,再合并返回结果:
// 初始化三个餐次的查询请求 const mealQueries = ['Breakfast', 'Lunch', 'Dinner'].map(meal => query(collectionGroup(db, meal), where('calories', '<', 500)) ); // 并行执行所有查询 const querySnapshots = await Promise.all(mealQueries.map(q => getDocs(q))); // 合并所有符合条件的食品数据 const allLowCalFoods = querySnapshots.flatMap(snapshot => snapshot.docs.map(doc => doc.data()));
该方案无需修改原有数据,三次查询的累计文档读取次数和方案1完全一致,没有额外开销。
内容的提问来源于stack exchange,提问作者Peter Stenger
相关产品推荐
相关产品推荐

