使用Pymongo / MongoDB迭代游标对象的有效方法



我预过滤了 3 个集合并从中构建了一个新集合。为此,我像这样迭代游标对象(monate,wochen,tage只是包含相关datetime对象的列表:

monate_final = collection1.find({"NewDate": {"$in": list(monate)}})
wochen_final = collection2.find({"NewDate": {"$in": list(wochen)}})
tage_final = collection3.find({"NewDate": {"$in": list(tage)}})
master_list = [monate_final, wochen_final, tage_final]
for collection in master_list:
for document in collection:
self.target.insert_one(document)

代码有效,但由于最终集合包含> 1 亿条记录,因此该过程需要很长时间。我没有找到更有效的方法。由于内存限制,构建熊猫DataFrame然后使用insert_many()不起作用。谁能帮我?

使用批量操作并将批量写入分解为块,例如,根据此示例,50,000 个块。您可以使用计数器(可能更快(或只是检查len(updates)

from pymongo import InsertOne
updates = []
counter = 0
for collection in master_list:
for document in collection:
updates.append(InsertOne(document))
counter += 1
if counter > 50000:
self.target.bulk_write(updates)
counter = 0
updates = []
# Update the final items after the cursor has exhausted
if len(updates) != 0:
self.target.bulk_write(updates)

我没有足够的声誉来将其作为评论。

我还没有验证这一点。但是,您可以创建一个聚合管道来筛选您的集合。管道中的最后一步是$out运算符将管道中的所有文档保存到新集合中。

https://docs.mongodb.com/manual/reference/operator/aggregation/out/

我还没有深入了解MongoDB的内部工作原理。但我希望管道完全在数据库端运行,这将大大提高操作的性能。

祝你好运解决这个问题!(不要忘记为其他人添加您的解决方案:D (

相关内容

最新更新