我正在处理一个太大而不能完全加载到内存中的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。有没有办法对集合执行搜索并将结果作为给定大小的批次列表返回?
答案 0 :(得分:0)
如果我理解正确,您正尝试在一个字段上加入两个集合。如果您使用的是MongoDB 3.2或更高版本,则可以在聚合框架中尝试$lookup operator。它相当于关系数据库中的左外连接。但如果pymongo支持或不支持,我不确定。如果它不支持它,也许你可以使用$ limit和$ skip操作符来不将所有集合加载到内存中。您可以从here.
访问pymongo文档