根据函数更新每个文档的特定字段
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 等原始方法。
我的 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 等原始方法。