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

Python中将日期转为ISODate用于MongoDB聚合查询的问题

解决Python中MongoDB聚合查询的日期转换问题

问题原因

  1. ISODate是MongoDB Shell专属语法:Python中直接使用ISODate()会触发语法错误,因为这并非Python内置方法。
  2. date对象的isoformat()无效:你使用的datetime.date类型仅包含日期,调用isoformat()返回的是纯日期字符串(如"2022-11-05"),而MongoDB中processedDate存储的是带时区的ISODate(即datetime类型),字符串与日期类型无法匹配,因此查不到数据。

解决方案

直接传入带UTC时区的Python datetime对象,pymongo会自动将其转换为MongoDB的ISODate类型,无需手动格式化字符串。

步骤1:修正日期获取代码

将datetime.date对象转换为带时间和UTC时区的datetime.datetime对象:

import datetime
from pymongo import MongoClient

# 获取基础日期
today_date = datetime.date.today()
yesterday_date = today_date - datetime.timedelta(days=1)
day_2 = today_date - datetime.timedelta(days=2)

# 转换为UTC时区的datetime对象(对应日期的00:00:00)
day_2_utc = datetime.datetime.combine(day_2, datetime.time.min).replace(tzinfo=datetime.timezone.utc)
yesterday_utc = datetime.datetime.combine(yesterday_date, datetime.time.min).replace(tzinfo=datetime.timezone.utc)

步骤2:编写聚合查询管道

简化原查询的$and条件(同一字段的范围查询可合并),直接传入datetime对象:

pipeline = [
    {
        "$match": {
            "sku": "7908397",
            "storeLocationId": 1052,
            "processedDate": {
                "$gte": day_2_utc,
                "$lt": yesterday_utc
            }
        }
    }
]

# 执行聚合查询
client = MongoClient("你的MongoDB连接URI")
db = client["目标数据库名"]
collection = db["目标集合名"]
results = list(collection.aggregate(pipeline))

关键说明

  • 确保processedDate字段在MongoDB中确实存储为ISODate类型,而非字符串。
  • 若你的业务时间是本地时区,需先转换为UTC再传入,避免时区偏差导致的查询错误。

内容的提问来源于stack exchange,提问作者Chaitanya SH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 18:25:38