首先,我想说的是,在python方面我是一个彻头彻尾的noob,但事实上,我目前正试图在python脚本中解决一个较小的问题
因此,我使用mongo db在名为reservations
的mongo db集合中存储一些保留数据
收集数据的示例:
{
_id: ObjectId("5f2820a2f8279f6a284d4f02")
eventId: "AQMkAGFlMTBmNWMwLTRhNjEtNDFhMS1iOWM3LTc4YjNlYTg5YWIxMQAARgAAA3tu3bjjJ0..."
startTime: 2020-08-03T12:13:00.000+00:00,
endTime: 2020-08-03T12:32:00.000+00:00,
finished: false
}
现在,我尝试使用以下代码更新所有过期事件数据:
@catch_exceptions()
def finish_reservations():
now = datetime.datetime.utcnow().replace(microsecond=0, second=0)
logging.info("Finishing expired reservations...")
if db.reservations.count_documents({ "finished": {"$exists": False} }) > 0:
db.reservations.update_many({ "finished": {"$exists": False} }, {"$set": {"finished": True}})
for reservation in db.reservations.find({"endTime": {"$lt":now}, "finished": {"$eq": False}}):
db.reservations.update_one(
{ 'eventId': reservation['eventId'] },
{ '$set': { 'finished': True } }
)
因此,我试图实现以下目标:
如果集合中的任何数据尚未具有字段finished
existant,请将其添加为值“true”。之后,检查尚未完成的事件,如果它们的endTime
日期和时间时间戳低于now
日期和时间戳,则完成它们
问题:上述解决方案实际上并没有更新所有预期的数据项。。。即使finished
状态为false
,endTime
状态为def,也不会更新上面的示例。低于now
(datetime.datetime(2021, 3, 8, 14, 24)
)。其他条目已正确更新
有人对此有什么建议吗
日期和时区在python和pymongo中是一个巨大的陷阱
在MongoDB中使用
date
BSON类型时,日期始终存储在UTC中。因此,您可能认为使用datetime.datetime.utcnow()
是有意义的,但遗憾的是没有utcnow()
返回时区初始日期时间。这意味着它将在不同的时区给出不同的结果。我想这将是你的问题如果你想赌一把,确保你的MongoClient connection有
tz_aware=True
并使用时区识别日期,例如相关问题 更多 >
编程相关推荐