获取pymongo .find()结果返回给定大小的列表列表

时间:2017-02-22 17:18:40

标签: python mongodb pymongo pymongo-3.x

我正在处理一个太大而不能完全加载到内存中的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。有没有办法对集合执行搜索并将结果作为给定大小的批次列表返回?

1 个答案:

答案 0 :(得分:0)

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

访问pymongo文档