我有一个“外部”Python函数,它迭代MongoDB集合的所有文档,并使用批量API相应地创建/更新它们。有一个计数器和一个批处理大小,所以当计数器等于批处理大小时,有一个bulk.execute()
命令,以及计数器和批量对象的重新初始化。
这个外部函数相当“精益” - 它包含这些文档的所有唯一ID的迭代器以及当计数器达到预定批量大小时批量的执行/重置。对于每个唯一ID,将调用处理每个单独文档的“内部”函数,这是大部分工作完成的地方。
现在,在内部函数中我还需要更新另一个MongoDB集合的一些文档,所以我想使用单独的批量操作来完成它。
我的问题是: 我应该在内部函数中定义/执行/重置第二个批量对象吗?或者我应该在外部函数中定义它,将它作为参数传递给内部函数,并在计数器满足批量大小要求时将其与外部的其他批量对象一起执行?在这种情况下,第二个批量对象是通过引用更新的,还是应该将它作为内部函数的第二个返回/输出?
编辑:我的代码有结构:
def update_collection(db, batch_size=10000):
bulk_1 = db.collection_1.initialize_unordered_bulk_op()
[...]
for unique_id in unique_ids:
updated_doc = update_doc(db, unique_id)
if updated_doc != None:
count += 1
bulk_1.find({'unique_id': unique_id}).upsert().update({'$set':updated_doc})
def update_doc(db, unique_id):
doc = db.collection_1.find_one({'unique_id': unique_id})
bulk_2.find({'other_unique_id': doc['other_unique_id']}).update(...)
问题是: 我应该在update_collection函数中定义bulk_2(执行/重置发生的位置?bulk_2更新是否通过引用更新,即使它存在于内部的update_doc函数中?