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

PyMongo count_documents()结合datetime查询无结果问题求助

排查步骤与解决方案

1. 修正时间范围计算逻辑(核心问题)

你当前的时间过滤逻辑存在错误:$gte取的是当前时间减24小时所在日期的起始,但$lt取的是当前日期的结束,导致时间范围远超预期(从打印结果看是接近两天的区间),大概率没有数据落在这个范围内。

根据需求选择正确的时间计算方式:

  • 统计最近24小时数据:
    filter['created_at'] = {
        '$gte': arrow.now(settings.TIME_ZONE).shift(hours=-24).datetime,
        '$lt': arrow.now(settings.TIME_ZONE).datetime,
    }
    
  • 统计昨天一整天(本地时区)的数据:
    # 获取本地时区的昨天日期
    yesterday_local = arrow.now(settings.LOCAL_TIME_ZONE).shift(days=-1)
    # 转换为目标时区(UTC)的起止时间
    start_utc = yesterday_local.floor('day').to(settings.TIME_ZONE).datetime
    end_utc = yesterday_local.ceil('day').to(settings.TIME_ZONE).datetime
    
    filter['created_at'] = {'$gte': start_utc, '$lt': end_utc}
    

2. 验证MongoDB中created_at字段的存储格式

执行MongoDB Shell命令,查看字段的实际存储类型:

// 查看任意一条数据的created_at字段
db.your_collection_name.findOne({}, {created_at: 1, _id: 0})
  • 如果返回的是ISODate("2023-XX-XXTXX:XX:XXZ")(带时区的日期),确保过滤条件的datetime对象带正确时区(你的打印结果显示是tzutc(),符合要求)。
  • 如果返回的是字符串(如"2023-11-23 10:00:00"),需要将过滤条件转换为相同格式的字符串:
    start_str = arrow.now(settings.LOCAL_TIME_ZONE).shift(days=-1).floor('day').to(settings.TIME_ZONE).format('YYYY-MM-DDTHH:mm:ss.SSSZ')
    end_str = arrow.now(settings.LOCAL_TIME_ZONE).shift(days=-1).ceil('day').to(settings.TIME_ZONE).format('YYYY-MM-DDTHH:mm:ss.SSSZ')
    filter['created_at'] = {'$gte': start_str, '$lt': end_str}
    
  • 如果返回的是不带时区的datetime(MongoDB中会视为本地时间),需要将过滤条件转换为不带时区的datetime:
    start_naive = arrow.now(settings.LOCAL_TIME_ZONE).shift(days=-1).floor('day').to(settings.TIME_ZONE).naive
    end_naive = arrow.now(settings.LOCAL_TIME_ZONE).shift(days=-1).ceil('day').to(settings.TIME_ZONE).naive
    filter['created_at'] = {'$gte': start_naive, '$lt': end_naive}
    

3. 手动在MongoDB Shell中验证过滤条件

将打印出的时间条件转换成MongoDB Shell格式,直接执行查询:

db.your_collection_name.find({
    created_at: {
        $gte: ISODate("2023-11-22T18:30:00Z"),
        $lt: ISODate("2023-11-24T18:29:59.999Z")
    }
}).limit(5)
  • 如果查询无结果:说明确实没有符合该时间范围的数据,需要调整时间逻辑。
  • 如果查询有结果:检查Python代码中filters字典是否被意外修改,或确认self.collection指向的是正确的集合。

4. 检查集合索引(非必需,但优化性能)

如果集合数据量较大,为created_at创建索引可以加速查询:

db.your_collection_name.createIndex({created_at: 1})

内容的提问来源于stack exchange,提问作者Shreyas H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:23:36