Firebase Firestore Timestamp条件不生效,求技术支持
解决Firestore Timestamp查询条件失效的问题
嘿,我一眼就瞅出你代码里的问题啦——日期比较的逻辑写反了,这才导致查询拿不到预期的数据!
问题根源分析
你先看这段日期定义:
let today = moment(), past = moment(today).subtract(30, 'days');
past是今天往前推30天的日期,它肯定比today早。但你后面的查询条件却是:
.where("creation_date", "<=", past.toDate()) .where("creation_date", ">=", today.toDate())
这相当于要找「比30天前更早,同时又比今天更晚」的记录,这两个条件完全没有交集,自然查不到任何数据啦!
修正后的完整代码
只需要调换两个日期比较的条件顺序和符号就行:
static getHistory(uid) { let today = moment(), past = moment(today).subtract(30, 'days'); const db = Firebase.firestore(); return db.collection("user_history") .orderBy("creation_date") .where("user_id", "==", uid) .where("creation_date", ">=", past.toDate()) // 先筛选30天前及之后的记录 .where("creation_date", "<=", today.toDate()) // 再筛选今天及之前的记录 .withConverter(UserHistoryConverter) .get() .then((querySnapshot) => { const products = []; querySnapshot.forEach((doc) => { const data = doc.data(); if (_.isObject(data)) products.push(data); }); return products; }); }
额外注意事项
- 如果运行时弹出复合索引缺失的错误,记得去Firebase控制台的Firestore页面,按照错误提示创建包含
user_id和creation_date的复合索引,不然多条件查询会失败。 - 确认Firestore里的
creation_date字段确实是存储为Timestamp类型,要是存成字符串或者其他格式,日期比较逻辑也会失效哦。
内容的提问来源于stack exchange,提问作者Umid Boltabaev
相关产品推荐
相关产品推荐

