我正在处理一个太大而无法完全加载到内存中的 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
然而,这看起来很老套。有没有一种方法可以对集合执行搜索并将结果作为给定大小的批处理列表返回?
最佳答案
如果我理解正确的话,您正试图在一个字段上加入两个集合。如果您使用的是 MongoDB 3.2 或更高版本,您可以尝试 $lookup operator在聚合框架中。它相当于关系数据库中的左外连接。但我不确定 pymongo 是否支持它。如果它不支持它,也许您可以使用 $limit 和 $skip 运算符不将所有集合加载到内存中。您可以从 here. 获得 pymongo 文档
关于python - 获取以给定大小的列表列表形式返回的 pymongo .find() 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42398177/