Cloud Functions查询Firestore字符串格式日期字段返回空记录问题
问题根因分析
你的查询逻辑存在两个核心错误,导致无法返回正确结果:
where()方法的第一个参数必须为待查询的字段名称字符串,你当前代码将"reqDate"直接传入moment格式化,本质是把"reqDate"这个文本本身当作日期解析,返回的是无效日期值,完全没有指向你需要查询的reqDate字段。- 你当前存储的
reqDate是MM/DD/YYYY, hh:mm:ss A格式的字符串,直接做日期比较的话,仅同一年的数据能匹配字符串字典序,跨年会出现顺序错乱问题。
解决方案
方案1:不修改现有存储结构(临时兼容)
如果你暂时不需要调整已存储的字段格式,仅需要做同一年的日期筛选,直接修正查询语法即可:
const thisCollection = firestore.collection("ItemList") // 第一个参数直接传字段名,不需要用moment包裹 .where("reqDate", ">", "10/05/2021");
注意:该方案仅适合同一年的日期筛选,若存在跨年数据,12/31/2021的字符串排序会大于01/01/2022,出现逻辑错误。如果需要筛选完整的天级数据,推荐用双条件范围查询避免边界问题:
const thisCollection = firestore.collection("ItemList") .where("reqDate", ">=", "10/05/2021") .where("reqDate", "<", "10/06/2021");
方案2:优化存储格式(长期推荐)
为了保证查询准确性和性能,建议新增字段存储标准格式的时间:
- 写入数据时,将
reqDate转成YYYY-MM-DD格式的字符串,或者直接存储Firestore Timestamp类型、Unix时间戳 - 查询时直接对标准格式字段做比较,示例如下(假设新增了
reqDateISO字段存储2021-10-11格式的日期):
const thisCollection = firestore.collection("ItemList") .where("reqDateISO", ">", "2021-10-05");
该格式的字符串字典序和时间顺序完全一致,跨年月也不会出现逻辑错误,同时查询性能也更高。
内容的提问来源于stack exchange,提问作者Edward James Smith II
相关产品推荐
相关产品推荐

