Firestore筛选异常:无法查询sellerDetails.selectedHoursByDay子值
问题原因
你当前代码里用arrayContainsAny筛选sellerDetails.selectedHoursByDay是错误的——从数据库结构来看,这个字段是Map类型(键值对),而arrayContainsAny只适用于数组类型的字段,所以无法匹配到预期结果。
解决方案
根据你的需求(匹配daysFilter中任意一个日期作为键的文档),可以通过以下两种方式处理:
方式1:直接适配现有数据库结构
利用Firestore的Filter.or组合多个字段存在性检查,判断selectedHoursByDay中是否包含daysFilter里的日期键:
void applyFilter() async{ Query<Map<String, dynamic>> filterquery = _firestore.collection('Users'); if (nameFilter != null && nameFilter!.isNotEmpty) { filterquery = filterquery.where('sellerDetails.sellerName', isEqualTo: nameFilter); } if (cityFilter != null && cityFilter!.isNotEmpty) { filterquery = filterquery.where('sellerDetails.city', isEqualTo: cityFilter); } if (districtFilter != null && districtFilter!.isNotEmpty) { filterquery = filterquery.where('sellerDetails.district', isEqualTo: districtFilter); } if (daysFilter != null && daysFilter!.isNotEmpty) { // 生成每个日期的存在性检查条件 final List<Filter> dayFilters = daysFilter!.map((day) { return Filter.exists('sellerDetails.selectedHoursByDay.$day'); }).toList(); // 用OR组合所有条件 filterquery = filterquery.where(Filter.or(...dayFilters)); } setState(() { _userStream = filterquery.snapshots(); }); }
方式2:优化数据库结构(推荐)
如果项目还处于开发初期,建议把sellerDetails.selectedHoursByDay改成数组类型,结构示例:
selectedHoursByDay: [ {"day": "Monday", "hours": ["09:00-12:00", "14:00-18:00"]}, {"day": "Tuesday", "hours": ["09:00-12:00"]} ]
之后就可以用arrayContainsAny直接筛选:
if (daysFilter != null && daysFilter!.isNotEmpty) { final List<Map<String, dynamic>> dayObjects = daysFilter!.map((day) { return {"day": day}; }).toList(); filterquery = filterquery.where('sellerDetails.selectedHoursByDay', arrayContainsAny: dayObjects); }
这种结构更灵活,后续扩展筛选条件(比如同时匹配日期和时间段)也更方便。
内容的提问来源于stack exchange,提问作者Korhan_34
相关产品推荐
相关产品推荐

