如何用FlutterFire查询Firestore两个时间戳间文档,双where无结果?
问题排查与解答
这不是Firebase Firestore的已知限制,Firestore完全支持对同一个字段叠加多个范围查询条件,你写的查询语法本身符合官方规则,没有触发查询限制。
你可以按照以下步骤逐一排查问题:
- 验证时间区间的正确性:打印
period.startsAt和period.endsAt的具体值,确认开始时间早于结束时间,且时间区间的范围确实包含你预期要查询的订单的fullyPaidAt值。该问题大多是时间参数传反、或者时间精度设置不符合预期导致的,比如你把结束时间设置为目标日期的0点,就会过滤掉当天所有的订单。 - 验证单条件查询返回结果的交集:把仅用
isGreaterThan条件返回的所有订单的fullyPaidAt值,和仅用isLessThan条件返回的值做对比,确认是否存在同时满足两个条件的订单。如果两个单条件返回的结果没有交集,组合查询自然不会返回内容。 - 检查字段类型匹配:确认你存储的
fullyPaidAt字段确实是Firestore原生的Timestamp类型,没有存成字符串或者数字时间戳,避免类型不匹配导致的范围比对失效。
你可以先用固定时间区间做测试,确认查询逻辑本身没问题:
// 替换为你确定存在对应订单的时间区间 var testStart = Timestamp.fromDate(DateTime(2024, 1, 1)); var testEnd = Timestamp.fromDate(DateTime(2024, 1, 31)); var snapshot = await db .collection('order') .orderBy('fullyPaidAt') .where('fullyPaidAt', isGreaterThan: testStart) .where('fullyPaidAt', isLessThan: testEnd) .limit(10) .get();
你提供的订单字段截图如下:
内容的提问来源于stack exchange,提问作者ckyony
相关产品推荐
相关产品推荐

