Python PyMongo:无法更新早于7天的条目。需要处理ISODate

Python PyMongo:无法更新早于7天的条目。需要处理ISODate,python,mongodb,pymongo,Python,Mongodb,Pymongo,我正在尝试创建一个脚本,该脚本将更新Mongo中具有挂起状态的条目,即7天前创建的条目。然而,我遇到的问题似乎源于创建日期的存储方式 我在mongodb中运行以下命令: db.jobs.find( {"$and":[{"status": "PENDING"},{"createdOn":{"$lt":ISODate('2020-11-30T00:00:00.00000')}}]}) 其中ISODa

我正在尝试创建一个脚本,该脚本将更新Mongo中具有挂起状态的条目,即7天前创建的条目。然而,我遇到的问题似乎源于创建日期的存储方式

我在mongodb中运行以下命令:

db.jobs.find( {"$and":[{"status": "PENDING"},{"createdOn":{"$lt":ISODate('2020-11-30T00:00:00.00000')}}]})
其中ISODate是7天前。我得到了之前创建的条目(注意:我不确定为什么$lt适用于此,但当我使用$gt时,我没有得到任何结果)。返回的条目中的createdOn字段如下所示:

"createdOn" : ISODate("2020-11-20T18:50:40.062Z")
当我在python中运行类似的一批代码时:

from pymongo import MongoClient
import pymongo
from datetime import datetime, timedelta

newDate = datetime.utcnow() - timedelta(days=7)

pendingJobs = list(db.jobs.find( {"$and":[{"state": "PENDING"},{"createdOn":{"$lt":newDate}}]}))
print(pendingJobs)
日期以以下格式返回:

'createdOn': datetime.datetime(2020, 11, 20, 18, 50, 40, 62000)
这似乎阻止我使用pymongo更新状态字段:

db.jobs.update( {"$and":[{"state": "PENDING"},{"createdOn":{"$lt":newDate}}]}, { "$set": {"status":"FAILED"} })
因为pymongo使用datetime运行,而Mongo使用ISODate运行。我该怎么解释呢?我已经尝试了以下方法,但没有效果:

  • 将newDate格式化为ISODate
  • 尝试将“ISODate”合并到字符串本身中:

pymongo驱动程序将一个python
datetime.datetime
映射到一个BSON
date
,您可以在shell中看到这个BSON
ISODate
。所以你的第一个方法很好-不需要对日期做任何花哨的事情

值得注意的是,MongoDB过滤器在默认情况下是
的,因此您可以简单地查询:

db.jobs.find({"state": "PENDING", "createdOn": {"$lt": newDate}})
我怀疑您的根本原因是您正在查询
状态
,但正在更新
状态

此代码示例应适用于:

from pymongo import MongoClient
from datetime import datetime, timedelta

db = MongoClient()['mydatabase']

# Set up some sample data

for days in range(8):
    db.jobs.insert_one({'state': 'PENDING', 'createdOn': datetime.utcnow() - timedelta(days=days)})

newDate = datetime.utcnow() - timedelta(days=7)

db.jobs.update_many({"state": "PENDING", "createdOn": {"$lt": newDate}}, {'$set': {'state': 'FAILED'}})

pendingJobs = list(db.jobs.find({'state': 'FAILED'}))
print(pendingJobs)
印刷品:

[{'_id': ObjectId('5fce82c2916f9131fec02966'), 'state': 'FAILED', 'createdOn': datetime.datetime(2020, 11, 30, 19, 30, 10, 393000)}]

这很有效。非常感谢你。
from pymongo import MongoClient
from datetime import datetime, timedelta

db = MongoClient()['mydatabase']

# Set up some sample data

for days in range(8):
    db.jobs.insert_one({'state': 'PENDING', 'createdOn': datetime.utcnow() - timedelta(days=days)})

newDate = datetime.utcnow() - timedelta(days=7)

db.jobs.update_many({"state": "PENDING", "createdOn": {"$lt": newDate}}, {'$set': {'state': 'FAILED'}})

pendingJobs = list(db.jobs.find({'state': 'FAILED'}))
print(pendingJobs)
[{'_id': ObjectId('5fce82c2916f9131fec02966'), 'state': 'FAILED', 'createdOn': datetime.datetime(2020, 11, 30, 19, 30, 10, 393000)}]