【发布时间】:2021-06-06 10:59:45
【问题描述】:
首先,我想说我在 python 方面完全是个菜鸟,但实际上我目前正在尝试在 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 } }
)
所以我尝试实现以下目标:
如果集合中有任何数据还没有字段finishedexistant,则将其添加为“true”。之后,检查尚未完成的事件并在其endTime 日期和时间时间戳低于now 日期和时间时间戳时完成它们。
问题:上面的解决方案实际上并没有更新所有预期的数据条目......即使finished 状态为false 并且endTime 为def,上面的示例也没有更新。低于now (datetime.datetime(2021, 3, 8, 14, 24))。其他条目已正确更新...
有人对此有什么建议吗?
【问题讨论】:
-
{ 'id': reservation['id'] }这里必须是_id,以下划线开头 -
也许你最好摆脱循环并使用 update_many
-
抱歉,我的代码示例中有一个小错误,我使用
eventId字段,而不是_id字段进行更新。是的,我会更改它并使用 update_many。也许这有帮助:o -
我已经摆脱了循环并将其更改为
db.reservations.update_many({ "endTime": { "$lt":now }, "finished": { "$eq": False } }, { '$set': { 'finished': True } }),但不幸的是,行为根本没有改变。
标签: python mongodb pymongo python-datetime