You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
    });
}

额外注意事项

  1. 如果运行时弹出复合索引缺失的错误,记得去Firebase控制台的Firestore页面,按照错误提示创建包含user_id和creation_date的复合索引,不然多条件查询会失败。
  2. 确认Firestore里的creation_date字段确实是存储为Timestamp类型,要是存成字符串或者其他格式,日期比较逻辑也会失效哦。

内容的提问来源于stack exchange,提问作者Umid Boltabaev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 09:27:48