2017-02-22 51 views
1

我用MongoDB的集合,是太大,在內存中加載整個工作表的清單,我想用它使用PyMongo工作。獲取pymongo .find()返回結果爲給定大小

對於每一個項目,我不得不在另一個集合搜索和應用功能的結果。

第一種算法,我想出了是:

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

但執行的每個元素搜索只需花費太多的時間,因爲它必須等待每一次服務器響應。

爲了減少等待時間,每個元素我試圖使用-say的批次,500 - 一次文件。

我發現如何做到這一點使用上的光標

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 

的next()方法。然而這似乎很哈克的唯一途徑。有沒有辦法對集合執行搜索並將結果作爲給定大小的批次列表返回?

回答

0

如果我理解正確,您試圖加入一個場兩個集合。如果你正在使用MongoDB的3.2或更高版本,你可以在聚合框架嘗試$lookup operator。它相當於關係數據庫中的左外連接。但我不確定pymongo是否支持它。如果它不支持它,也許可以使用$ limit和$ skip操作符不將所有集合加載到內存中。您可以從here.

+0

PyMongo達到pymongo文件不需要做任何事情來支持$查找,它通過你的整個聚合管道輸送到服務器,不管你指定什麼運營商。 –

+0

謝謝,我會牢記這一點。 –