【问题标题】:PyMongo update multiple records with multiple dataPyMongo 用多条数据更新多条记录
【发布时间】:2021-07-16 14:11:16
【问题描述】:

我正在尝试通过 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'}] ...

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

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    我假设您有某种“_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 的第一个参数是指定要匹配哪个文档的查询,第二个参数是一组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()”时立即执行。 Bulk update operations 与 PyMongo 和 MongoDB 2.6+ 相比,与传统更新相比,需要更少的往返服务器。

    【讨论】:

    • 你不能只将整个集合传递给 update_many 方法而不是迭代它们吗?假设您要更新所有记录? cursor = db.collection.update_many({}, myposts, upsert=True)>
    • 这对我不起作用。 myposts 是一个文档数组。
    【解决方案2】:

    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)
    

    【讨论】:

      猜你喜欢
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 2016-05-01
      • 2013-05-02
      • 2014-03-04
      相关资源
      最近更新 更多