Python:MongoDB按时间戳更新未按预期工作

Python:MongoDB按时间戳更新未按预期工作,python,mongodb,pymongo,python-datetime,Python,Mongodb,Pymongo,Python Datetime,首先,我想说的是,在python方面我是一个彻头彻尾的noob,但事实上,我目前正试图在python脚本中解决一个较小的问题 因此,我使用mongo db在名为reservations的mongo db集合中存储一些保留数据 收集数据的示例: { _id:ObjectId(“5f2820a2f8279f6a284d4f02”) 事件ID:“AQMKAGFLMTBMNWMWLTRHJETNDFHMS1OWM3LTC4YJNLYTG5YWIXMQAARGAARA3TU3BJJ0…” 开始时间:202

首先,我想说的是,在python方面我是一个彻头彻尾的noob,但事实上,我目前正试图在python脚本中解决一个较小的问题

因此,我使用mongo db在名为
reservations
的mongo db集合中存储一些保留数据

收集数据的示例:

{
_id:ObjectId(“5f2820a2f8279f6a284d4f02”)
事件ID:“AQMKAGFLMTBMNWMWLTRHJETNDFHMS1OWM3LTC4YJNLYTG5YWIXMQAARGAARA3TU3BJJ0…”
开始时间:2020-08-03T12:13:00.000+00:00,
结束时间:2020-08-03T12:32:00.000+00:00,
完成:错误
}
现在,我尝试使用以下代码更新所有过期事件数据:

@catch_异常()
def finish_reservations():
now=datetime.datetime.utcnow().replace(微秒=0,秒=0)
logging.info(“完成过期预订…”)
如果db.reservations.count_文档({“finished”:{“$exists”:False})>0:
update_many({“finished”:{“$exists”:False},{“$set”:{“finished”:True})
对于db.reservations.find({“endTime”:{“$lt”:now},“finished”:{“$eq”:False}})中的保留:
db.reservations.update_one(
{'eventId':保留['eventId']},
{'$set':{'finished':True}
) 
因此,我试图实现以下目标:

如果集合中的任何数据尚未包含字段
finished
existant,请将其添加为值“true”。之后,检查尚未完成的事件,如果它们的
endTime
日期和时间时间戳低于
now
日期和时间戳,则完成它们

问题:上述解决方案实际上并没有更新所有预期的数据项。。。即使
finished
状态为
false
endTime
为def,上述示例也不会更新。低于现在的
datetime.datetime(2021,3,8,14,24)
)。其他条目已正确更新


有人对此有什么建议吗?

在python和pymongo中,日期和时区是一个巨大的陷阱

在MongoDB中使用
date
BSON类型时,日期始终存储在UTC中。因此,您可能认为使用
datetime.datetime.utcnow()
是有意义的,但遗憾的是没有

utcnow()
返回时区初始日期时间。这意味着它将在不同的时区给出不同的结果。我想这将是你的问题

如果您想进行赌博,请确保您拥有
tz_aware=True
并使用时区感知日期,例如

import pytz
now = datetime.datetime.now(pytz.utc)

日期和时区在python和pymongo中是一个巨大的陷阱

在MongoDB中使用
date
BSON类型时,日期始终存储在UTC中。因此,您可能认为使用
datetime.datetime.utcnow()
是有意义的,但遗憾的是没有

utcnow()
返回时区初始日期时间。这意味着它将在不同的时区给出不同的结果。我想这将是你的问题

如果您想进行赌博,请确保您拥有
tz_aware=True
并使用时区感知日期,例如

import pytz
now = datetime.datetime.now(pytz.utc)

{'id':reservation['id']}
这里必须是
\u id
,从下划线开始,也许你最好摆脱循环并使用update\u many对不起,我的代码示例中有一个小错误,我使用的是
事件id
字段,而不是
\u id
字段进行更新。是的,我会改变它并使用很多更新。也许这会有帮助:oI已经摆脱了循环并将其更改为
db.reservations.update\u many({“endTime”:{“$lt”:now},“finished”:{“$eq”:False},{'$set':{'finished':True}})
,但不幸的是,行为根本没有改变。
{'id':reservation['id']}
这里必须是
\u id
,从下划线开始,也许你最好去掉循环并使用update\u manySorry,我的代码示例中有一个小错误,我使用的是
eventId
字段,而不是
\u id
字段进行更新。是的,我会改变它并使用很多更新。也许这会有帮助:oI已经摆脱了循环并将其更改为
db.reservations.update_many({“endTime”:{“$lt”:now},“finished”:{“$eq”:False},{“$set”:{“finished”:True})
,但不幸的是,行为根本没有改变。哇,我可以搜索几个小时D这确实有效。数据现在已正确更新!非常感谢你。我会在interwebz上收集更多关于这方面的信息。哇,我可以搜索好几个小时D这确实有效。数据现在已正确更新!非常感谢你。我将在interwebz上收集更多关于这方面的信息。