Firebase Firestore组合搜索与日期范围查询返回空数组问题
问题原因
你的查询逻辑核心错误是混淆了Firestore游标分页方法和字段范围过滤的使用场景,同时违反了游标参数的匹配规则:
- Firestore的
startAt()、endAt()是用于分页的游标方法,传入的参数数量和顺序必须和你声明的orderBy()字段完全一一对应。你当前的查询先按name排序、再按createdAt排序,但是你只给startAt/endAt传了时间戳参数,相当于系统会把这个时间戳作为name字段的匹配起点,自然不存在符合条件的文档。 - 你对
createdAt的范围过滤需求,应该用where()条件实现,而不是游标方法。
修正后的代码
export const getUsers = async (minDate:Date, maxDate:Date) => { try { const DS = await admin .firestore() .collection("users") // 姓名范围过滤 .where("name", ">=", "abc") .where('name', "<=", "abc~") // 日期范围过滤,改用where实现 .where("createdAt", ">=", admin.firestore.Timestamp.fromDate(minDate)) .where("createdAt", "<=", admin.firestore.Timestamp.fromDate(maxDate)) // 排序规则符合Firestore要求:范围过滤的name字段作为第一个排序项 .orderBy('name', "asc") .orderBy('createdAt') .get(); if (DS.empty) { throw new functions.https.HttpsError( "invalid-argument", "无匹配数据" ); } const arr = DS.docs.map(doc => doc.data()); functions.logger.info("get successfully - ", DS.docs); return arr; } catch (error) { throw new functions.https.HttpsError( "invalid-argument", error.message ); } }
其他需要修正的逻辑问题
- 原函数没有返回查询的Promise,调用
getUsers时会拿不到返回的数组 forEach是同步方法,前面加await没有任何作用,直接用map处理文档数组即可- 原判断
if(DS)是无效的,查询执行成功后DS一定存在,应该判断DS.empty确认是否有匹配数据
内容的提问来源于stack exchange,提问作者Buddhika Prasadh
相关产品推荐
相关产品推荐

