2017-02-22 4 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 

그러나 각 요소에 대해 검색을 수행 단순히 너무 많은 시간이 걸립니다.

요소 당 대기 시간을 줄이기 위해 한 번에 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 

에 다음() 메소드를 사용하고이 작업을 수행하는 방법을 발견하는 유일한 방법. 컬렉션에 대한 검색을 수행하고 결과를 주어진 크기의 일괄 처리 목록으로 반환 할 수있는 방법이 있습니까?

답변

0

정확하게 이해했다면 필드에 두 개의 컬렉션을 결합하려고합니다. MongoDB 3.2 또는 이후 버전을 사용하는 경우 집계 프레임 워크에서 $lookup operator을 시도 할 수 있습니다. 관계형 데이터베이스의 왼쪽 외부 조인과 동일합니다. 그러나 pymongo가 지원하는지 여부는 확실하지 않습니다. 지원하지 않는 경우, $ limit 및 $ skip 연산자를 사용하여 모든 콜렉션을 메모리에로드하지 않을 수 있습니다. here.

+0

PyMongo는 $ lookup을 지원하기 위해 아무 것도 할 필요가 없으며 지정한 연산자와 상관없이 전체 집계 파이프 라인을 서버로 전달합니다. –

+0

고맙습니다. 그 점을 명심하십시오. –