【问题标题】:Fastest way of updating or alternatively inserting documents in MongoDB 4.2在 MongoDB 4.2 中更新或插入文档的最快方法
【发布时间】:2019-12-02 05:09:19
【问题描述】:

假设 MongoDB 集合包含必须定期更新新字段或子对象的文档;或者,如果文档尚不存在,则常规文档更新过程应插入新文档(典型的 upsert)。

实现这一目标的最快方法是什么?目前我有一个非常缓慢的三个阶段的过程:

第 1 阶段:根据包含其 customID 的列表查找必须更新的文档(customID 字段上存在索引)。

        db[myCollection].find({'customID': {'$in': myUpdateList}})

第 2 阶段:迭代在第 1 阶段检索到的光标中的文档,用新字段和/或子对象丰富它们。将尚未在数据库中尚未更新的新文档添加到同一文档列表中。

第 3 阶段:使用无序批量操作更新插入 MongoDB。

        bulk_mapping = db[myCollection].initialize_unordered_bulk_op()
        for key, value in enrichedDocs.items():
            bulk_mapping.find({'customID': key}).upsert().update({'$set': {'customID': key, 'enrichedBody': value['enrichedBody']}})
        bulk_mapping.execute()

【问题讨论】:

    标签: mongodb pymongo bulkinsert insert-update upsert


    【解决方案1】:

    你不需要先.find()然后.update(),你可以直接用upsert选项做update

    试试这个:

    bulk_mapping = db[myCollection].initialize_unordered_bulk_op()
    for key, value in enrichedDocs.items():
        bulk_mapping.update({
            'customID': key
        },{
            '$set': {
                'customID': key, 
                'enrichedBody': value['enrichedBody']
            }
        },upsert=True)
    bulk_mapping.execute()
    

    更新

    你可以使用下面的代码和pymongo来实现批量更新:

    from pymongo import UpdateOne
    
    bulk_operations=[]
    for key, value in enrichedDocs.items():
        bulk_operations.append(
            UpdateOne({
                'customID': key
            },{
                '$set': {
                    'customID': key, 
                    'enrichedBody': value['enrichedBody']
                }
            },upsert=True)
        )
    
    db[myCollection].bulk_write(bulk_operations);
    

    【讨论】:

    • 谢谢!除此之外,还有其他改进或其他方法吗?
    • 除此之外,我认为您将不得不在 for 循环中一一进行,这不是一个好方法。
    • 它会产生错误:AttributeError: 'BulkOperationBuilder' object has no attribute 'update'
    • upsert 参数不应作为 PyMongo 中的字典传递,而是作为选项传递:请更正您的答案以反映这一点。否则,您提出的方法似乎比我的问题中描述的方法快 13%。在您更正答案后,我将很乐意接受。
    • 我更新了我的答案。谢谢你纠正我。我没怎么用过pymongo
    猜你喜欢
    • 2017-03-07
    • 2018-04-05
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多