PyMongo使用多个数据更新多个记录

时间:2014-12-08 14:50:12

标签: python mongodb pymongo

我试图通过PyMongo将数据的数据存储在我的数据库中。

client = MongoClient('ip', port)
db = client.test_database
hdd = db.hdd

        products[{
        'Speed' : 'a', 
        'Capacity' : 'b',
        'Format' : 'c'
        }
        {
        'Speed' : 'd',
        'Capacity' : 'e', 
        'Format': 'f'}] ...

我的数据库有一个包含7个字段的表hdd,其中4个字段已经填满。 Speedcapacityformat的值为"",需要替换为products的数据。我想用字典的数据填充空字段。 有没有办法像这样更新hdd,如果有可能,怎么办?

2 个答案:

答案 0 :(得分:4)

我假设您有一些与每组值相关联的“_id”值,因此您知道要更新集合中的哪个文档?我们称之为“product_id”。您可以更新单个文档,如:

for product, product_id in data:
    hdd.update({'_id': product_id},
               {'$set': {'Speed': products['Speed'],
                         'capacity': products['capacity'],
                         'format': products['format']}})

要更新的第一个参数是指定要匹配的文档的查询,第二个是update operations的一组。

如果您使用的是MongoDB 2.6或更高版本以及最新的PyMongo,请使用批量更新:

bulk = hdd.initialize_ordered_bulk_op()
for product, product_id in data:
    bulk.find({'_id': product_id}).update({'$set': {'Speed': products['Speed'],
                                                   'capacity': products['capacity'],
                                                   'format': products['format']}})
bulk.execute()

操作在客户端缓冲,然后当你调用“execute()”时,它们都被发送到服务器并立即执行。使用PyMongo和MongoDB 2.6+的Bulk update operations比传统更新需要更少的往返服务器。

答案 1 :(得分:0)

initialize_ordered_bulk_op 在我的 PyCharm 中显示为已弃用(我有 pymongo 3.9)。可以按如下方式进行批量更新:

replacements = [{ ObjectId("5fa994e96bfcb746d4935778"): "new_value"}]
bulk_ops = []
for _id, new_value in replacements.items():
    bulk_ops.append(
        UpdateOne(
            {"_id": _id},
            {"$set": {"old_key": new_value, "other_key": other_value}},
        ) 
    )
result = db.coll.bulk_write(bulk_ops)
pprint(result.bulk_api_result)