我试图通过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个字段已经填满。 Speed
,capacity
和format
的值为""
,需要替换为products
的数据。我想用字典的数据填充空字段。
有没有办法像这样更新hdd
,如果有可能,怎么办?
答案 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)