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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:22:42