【问题标题】:Get pymongo .find() result returned as list of lists of a given size获取作为给定大小列表列表返回的 pymongo .find() 结果
【发布时间】:2017-07-12 21:31:51
【问题描述】:

我正在处理一个太大而无法完全加载到内存中的 MongoDB 集合,我想使用 PyMongo 来处理它。

对于每个项目,我必须在另一个集合中进行搜索并将一个函数应用于结果。

我想出的第一个算法是:

for document in collection1.find():
     field1 = document['field']
     search = collection2.find({'field': field1})
     # Do some stuff with the search

但是对每个元素执行搜索只会花费太多时间,因为它每次都必须等待服务器响应。

为了减少每个元素的等待时间,我尝试一次使用 500 个文档的批次。

我发现如何做到这一点的唯一方法是在光标上使用 next() 方法

cursor = collection1.find()
while cursor.alive:
     batch_data = []
     for i in range(500):
          batch_data.append(cursor.next())
     fields = [i['field'] for i in bath_data]:
     search = collection2.find({'field': {"$in": fields}})
     # map each result to the correct document and then do my stuff

但是,这看起来很 hacky。有没有办法对集合执行搜索并将结果作为给定大小的批次列表返回?

【问题讨论】:

    标签: python mongodb pymongo pymongo-3.x


    【解决方案1】:

    如果我理解正确,您正在尝试在一个字段上加入两个集合。如果您使用的是 MongoDB 3.2 或更高版本,您可以在聚合框架中尝试$lookup operator。它相当于关系数据库中的左外连接。但我不确定 pymongo 是否支持。如果它不支持它,也许您可​​以使用 $limit 和 $skip 运算符不将所有集合加载到内存中。您可以通过here. 访问 pymongo 文档

    【讨论】:

    • PyMongo 不需要做任何事情来支持 $lookup,它会将你的整个聚合管道传递给服务器,无论你指定什么操作符。
    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 2022-01-04
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    相关资源
    最近更新 更多