Firestore如何通过where函数查询数组类型字段的指定下标值?
问题原因
你当前的查询不生效有两个核心原因:
- Firestore 原生不支持
数组字段[下标]这种语法直接查询数组指定位置的元素 - 你的查询条件值写的是字符串
"true",但存储的weekdays数组元素是布尔类型true,类型不匹配也无法命中结果
不需要拆成独立字段,更优的实现方案
你完全不用把7天状态拆成7个独立字段,推荐用枚举值数组+array-contains查询的方案,实现更简洁,查询效率也更高:
- 调整存储结构:不再存布尔数组,而是直接把商品在售的星期对应
getDay()返回的数字存入数组,比如你给出的示例[true, true, true, false, false, true, false](周日、周一、周二、周五在售),调整后存储为:
availableWeekdays = [0, 1, 2, 5]
- 调整查询逻辑:直接用Firestore原生支持的
array-contains运算符查询即可:
// assume date.getDay() is 5 const q = query( collection(db, "bakerys", `${bakery.id}`, "products"), where("availableWeekdays", "array-contains", date.getDay()) ); const querySnapshot = await getDocs(q);
这个方案不需要额外创建复合索引,查询性能和单独字段查询完全一致,后续维护也比多个独立字段更方便。
如果你不想修改现有布尔数组结构
如果必须保留现有的weekdays布尔数组结构,再考虑拆成独立字段的方案:把7天的状态分别存为weekday0到weekday6的布尔字段,查询逻辑调整为:
const q = query( collection(db, "bakerys", `${bakery.id}`, "products"), where(`weekday${date.getDay()}`, "==", true) );
这个方案也能正常生效,只是字段数量更多,后续调整逻辑的成本比枚举数组方案高。
内容的提问来源于stack exchange,提问作者Maximilian Dietel
相关产品推荐
相关产品推荐

