Python 如何通过ID列表更新mongodb中的许多值?

Python 如何通过ID列表更新mongodb中的许多值?,python,mongodb,pymongo,Python,Mongodb,Pymongo,我使用pymongo与mongodb一起工作。问题是:我需要通过ID列表更新mongodb中的许多集合条目 有一个集合具有以下结构: {'id': 'someid1', 'order': 0} {'id': 'someid2', 'order': 0} ... {'id': 'someidN', 'order': 0} 我需要用dict映射中收集的值更改顺序字段 mapping = {'someid1': 5, 'someid2': 7, ..., 'someidN': 50} 最明显的方法

我使用pymongo与mongodb一起工作。问题是:我需要通过ID列表更新mongodb中的许多集合条目

有一个集合具有以下结构:

{'id': 'someid1', 'order': 0}
{'id': 'someid2', 'order': 0}
...
{'id': 'someidN', 'order': 0}
我需要用dict
映射中收集的值更改
顺序
字段

mapping = {'someid1': 5, 'someid2': 7, ..., 'someidN': 50}
最明显的方法(可能不正确,因为它花费了很多时间,我打断了过程)是:

但正如我所看到的,这是非常耗时的。是否有任何聪明的方法通过值列表设置值?类似这样的代码(下面的代码很愚蠢,不能像我预期的那样工作):

我读过mongodb文档,但只找到了带有“条件”的示例(例如,如果条件为True,则使用相同值更改字段)。我想有一种有效的方法可以一次将值“映射”到多个ID。我对mongodb(以及pymongo)是新手,所以这个问题可能很傻。谢谢

是否有任何聪明的方法通过值列表设置值

不幸的是,使用标准的更新操作符时,没有。Mongodb的工作原理是需要一个用于更新的过滤器,因此像您正在尝试的任何东西都不可能在一个
update\u many()
中实现

确保在示例中的
id
字段上。“代码”>“ID ID<代码>字段”总是索引(并且总是唯一的),您可以考虑使用它。

也就是说,你的简单操作不应该太慢,除非你有一台速度慢的机器/网络或一个非常大的数据集。(注意,虽然您的代码不应该工作,但您的
$set
运算符位于错误的位置)

加快速度的一个选择是使用。下面的代码显示了如何做到这一点

from pymongo import MongoClient, UpdateOne
import pprint

db = MongoClient()['mydatabase']

# Test Data setup

for i in range(3):
    db.abcd.insert_one({'id': f'someid{i}', 'order': 0})

mapping = {'someid1': 5, 'someid2': 7}

updates = []

for key, value in mapping.items():
    updates.append(UpdateOne({'id': key}, {'$set': {'order': value}}))

# print the results

db.abcd.bulk_write(updates)

pprint.pprint(list(db.abcd.find({}, {'_id': 0})))
返回:

[{'id': 'someid0', 'order': 0},
 {'id': 'someid1', 'order': 5},
 {'id': 'someid2', 'order': 7}]
from pymongo import MongoClient, UpdateOne
import pprint

db = MongoClient()['mydatabase']

# Test Data setup

for i in range(3):
    db.abcd.insert_one({'id': f'someid{i}', 'order': 0})

mapping = {'someid1': 5, 'someid2': 7}

updates = []

for key, value in mapping.items():
    updates.append(UpdateOne({'id': key}, {'$set': {'order': value}}))

# print the results

db.abcd.bulk_write(updates)

pprint.pprint(list(db.abcd.find({}, {'_id': 0})))
[{'id': 'someid0', 'order': 0},
 {'id': 'someid1', 'order': 5},
 {'id': 'someid2', 'order': 7}]