使用mongoengine更新mongodb中的多个文档



我有一个类似的字典列表

{'data': '[{"url":"https://example1.com/photos-reviews/","score":0.671},{"url":"https://example1.com/concerts-events/concert-organ-performances/2018-2019/","score":0.662},{"url":"https://www.example2.org/support-volunteer/orchestra-league/","score":0.645}]', 'type': 'invalid'}

字段url是唯一的,并且基于字段type(无效或有效-此处无效(,mongodb中的字段hum_proc(默认为null(将分别更改为invalidvalid

我是做的

@sources_api.route('pending_val', methods=["GET", "POST"])
def pending_val():
if request.method=='POST':
data_rec = request.get_json()
if 'type' in data_rec:
data_list= json.loads(data_rec["data"])
for val in data_list:
MlData.objects(url=val["url"]).update_one(set__hum_proc=data_rec["type"])

我正在迭代和更新每一项。是否可以使用聚合管道或在一个步骤中更有效地更新这一点

您可以使用update()方法对查询匹配的字段执行原子更新:

MlData.objects(<your_query>).update(set__hum_proc=data_rec["type"])

更新:

update_one()方法覆盖或添加查询匹配的第一个文档,而update()多个字段执行更新。

我知道你想用等效的type值更新请求正文中的url。你可以在一行中做到这一点:

MlData.objects(url__in=[e['url'] for e in data_rec['data']]).update(set__hum_proc=data_rec["type"])

这里有几张纸条。

首先,我修改了您的请求json,删除了data密钥中的多余引号,使其可读性更强:

data_rec = {'data': [{"url": "https://example1.com/photos-reviews/",
"score": 0.671},
{"url": "https://example1.com/concerts-events/concert-organ-performances/2018-2019/",
"score": 0.662},
{"url": "https://www.example2.org/support-volunteer/orchestra-league/",
"score": 0.645}],
'type': 'valid'}

其次,我动态地从json中创建了url的列表,这最终使我能够使用in查询运算符在数据库中找到这些精确的值。

最新更新