2

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

4

1 回答 1

0

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

于 2017-02-22T17:57:33.807 回答