Firebase控制台查询构建器过滤时间戳时强制添加默认毫秒值导致查询结果与代码不一致
Firebase控制台查询构建器过滤时间戳时强制添加默认毫秒值导致查询结果与代码不一致
我最近碰到了一个头疼的问题:Firestore查询构建器和我代码里的查询结果完全对不上——用了一模一样的查询条件,代码能返回13条文档,但Web UI的查询构建器却一条都查不到!
先给大家看一下我用的查询条件:
startDate.toDate() = "2025-01-01T03:00:00.000Z" endDate.toDate() = "2025-02-01T02:59:59.999Z"
对应的TypeScript代码是这样的:
const querySnapshot = await transaction.get( db .collection('Coll_Name') .where('period_type', '==', periodType) .where('entity_id', '==', entity.id) .where('entity_type', '==', 1) .where('main_entity_id', '==', main_entity.id) .where('create_on', '>=', startDate) .where('create_on', '<=', endDate), ); console.log('after querySnapshot'); console.log( `Found ${querySnapshot?.docs?.length > 1 ? 'many' : 'some'} `, ); console.log('Length: ', querySnapshot?.docs?.length); // 这里返回13条文档
补充一下:如果去掉create_on的过滤条件,代码能查到41条文档,但把完全相同的条件搬到Web UI的查询构建器里,结果却是0条,这反差实在太大了!
后来我检查了控制台的网络请求,终于发现了问题所在:查询构建器实际发送的时间范围和我手动设置的不一样!它自动给时间戳加上了默认的毫秒值,实际发送的参数是这样的:
{ "fieldFilter": { "field": { "fieldPath": "create_on" }, "op": "GREATER_THAN_OR_EQUAL", "value": { "timestampValue": "2025-01-01T03:00:00.027000000Z" } } }, { "fieldFilter": { "field": { "fieldPath": "create_on" }, "op": "LESS_THAN_OR_EQUAL", "value": { "timestampValue": "2025-02-01T02:59:59.884000000Z" } } }
后续补充更新
- 给大家看几个UI场景:
- 调整时间范围后能正常返回结果的UI界面
- 另一个正常查询状态的UI界面
- 我发现只要把起始时间往前调1秒(比如从
2025-01-01T03:00:00.000Z改成2025-01-01T02:59:59.000Z),查询构建器就能返回我预期的13条文档。 - 但如果用我一开始设置的精确时间范围,查询构建器就返回空结果(对应UI界面:精确时间范围下无返回结果)
备注:内容来源于stack exchange,提问作者Omar Dulaimi
相关产品推荐
相关产品推荐

