Python操作MongoDB按日期查询无结果问题求助
解决MongoDB按指定日期值查询无结果的问题
问题根源
你看到的日志中{"$date": 1634569547000}是MongoDB对BSON Date类型的JSON序列化展示,并非数据库实际存储的格式。数据库里的updated_at字段是Date对象,不是数字,也不是包含$date的字典——这就是你之前用数字或{"$date": ...}查询无结果的原因。
正确查询方式
使用Python查询时,需要把毫秒级时间戳转换成UTC datetime对象(MongoDB默认存储UTC时间),再传入查询条件。
方法1:使用标准库datetime
from datetime import datetime updated_at_value = 1634569547000 # 将毫秒时间戳转为UTC datetime(注意除以1000转成秒级) target_date = datetime.utcfromtimestamp(updated_at_value / 1000) # 构造查询条件 query = {'updated_at': target_date} # 执行查询 cursor = collection.find(query).limit(10)
方法2:使用bson模块的datetime
如果需要兼容MongoDB的BSON类型,也可以直接用bson提供的datetime:
from bson import datetime as bson_datetime updated_at_value = 1634569547000 target_date = bson_datetime.fromtimestamp(updated_at_value / 1000) query = {'updated_at': target_date} cursor = collection.find(query).limit(10)
日期范围查询的正确写法
如果要查询某个时间段的文档,同样需要用datetime对象构造范围条件:
from datetime import datetime # 示例:查询2021-10-18当天的文档(UTC时间) start_timestamp = 1634505600000 # 2021-10-18 00:00:00 UTC end_timestamp = 1634591999000 # 2021-10-18 23:59:59 UTC start_date = datetime.utcfromtimestamp(start_timestamp / 1000) end_date = datetime.utcfromtimestamp(end_timestamp / 1000) query = { 'updated_at': { '$gte': start_date, '$lt': end_date } } cursor = collection.find(query)
为什么之前的写法无效
- 用
{'$eq': {"$date": updated_at_value}}:MongoDB会把{"$date": ...}当作普通的文档结构去匹配,而不是解析成Date类型,自然找不到对应数据。 - 直接使用数字
updated_at_value:数据库存储的是Date对象,和数字类型不匹配,所以查询无结果。
内容的提问来源于stack exchange,提问作者Tical
相关产品推荐
相关产品推荐

