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
相关产品推荐
相关产品推荐

