根据函数更新每个文档的特定字段

Update a specific field for each document based on a function

我的 collection 中有大约 10k 个文档,有 3 个字段(name, wait, utc)

时间戳对我来说太细了,我想将它们四舍五入到最后 10 分钟。

我创建了一个函数来修改这些时间戳(我通过一个名为 round_to_10min() 的函数将它们四舍五入,我从另一个 python 文件中导入了我称为 utility_func.py 的文件)。

它不光滑或任何东西,但它有效:

from datetime import datetime as dt

def round_to_10min(my_dt):
  hours = my_dt.hour
  minutes =(my_dt.minute//10)*10
  date = dt(my_dt.year,my_dt.month,my_dt.day)  
  return dt(date.year, date.month,date.day, hours, minutes)

有没有办法让我更新 collection 中每个文档的 'utc' 字段,而不用将光标保存到列表中,遍历它?

一个我想避免必须做的事情的例子(看起来效率不高):

alldocs = collection.find({})
for x in alldocs:
  id = x['_id']
  old_value = int(x['utc'])
  new_value = utility_func.round_to_10min(old_value)
  update_val = {"$set":{"utc":new_value}}
  collection.update_one({"_id":ObjectId(id)},update_val)

这是我认为我应该去的地方,但更新参数让我感到困惑...

update_value = {'$set':{'utc':result_from_function}}
collection.update_many({},update_value)

这在 pymongo 中可以实现吗?

您正在寻找的机制将不起作用。

Pymongo 仅支持 MongoDB 操作。如果您可以找到使用 MongoDB 操作实现目标的方法,则可以在单个 update_many 或聚合查询中执行此操作。

如果您更喜欢使用 python,那么您只能使用查找、循环、update_one 等原始方法。