커서에서 데이터 액세스
개요
이 가이드에서는 PyMongo를 사용하여 커서 에서 데이터에 액세스하는 방법을 배울 수 있습니다.
커서는 읽기 작업의 결과를 반복 가능한 배치로 반환하는 메커니즘입니다. 커서는 주어진 시간에 문서의 하위 집합만 보유하기 때문에 커서는 메모리 소비와 네트워크 대역폭 사용량을 모두 줄입니다.
PyMongo는 여러 문서를 반환하는 읽기 작업을 수행할 때마다 자동으로 커서에 해당 문서를 반환합니다.
샘플 데이터
이 가이드 의 예제에서는 Atlas 샘플 데이터 세트 의 sample_restaurants.restaurants
컬렉션 을 사용합니다. 무료 MongoDB Atlas cluster 를 생성하고 샘플 데이터 세트를 로드하는 방법을 학습 보려면 PyMongo 시작하기를 참조하세요.
반복적으로 커서 내용에 액세스
커서의 내용을 반복하려면 다음 예제와 같이 for
루프를 사용합니다.
results = collection.find() for document in results: print(document)
문서 개별 조회
next()
메서드를 호출하여 커서에서 문서를 개별적으로 검색합니다.
다음 예에서는 컬렉션에서 name
값이 "Dunkin' Donuts"
인 모든 문서를 찾습니다. 그런 다음 next()
메서드를 호출하여 커서의 첫 번째 문서를 인쇄합니다.
results = collection.find({ "name": "Dunkin' Donuts" }) print(results.next())
{'_id': ObjectId('...'), 'address': { ... }, 'borough': 'Bronx', 'cuisine': 'Donuts', 'grades': [...], 'name': "Dunkin' Donuts", 'restaurant_id': '40379573'}
모든 문서 검색
경고
쿼리에서 반환되는 문서의 수와 크기가 사용 가능한 애플리케이션 메모리를 초과하면 프로그램이 충돌합니다. 큰 결과 세트가 예상되는 경우 커서에 반복적으로 액세스합니다.
커서에서 모든 문서를 검색하려면 다음 예와 같이 커서를 list
로 변환합니다.
results = collection.find({ "name": "Dunkin' Donuts" }) all_results = list(results) for document in all_results: print(document)
커서 닫기
기본적으로 MongoDB는 클라이언트가 커서의 모든 결과를 소진하면 커서를 닫습니다. 커서를 명시적으로 닫으려면 다음 예제와 같이 close()
메서드를 호출합니다.
results = collection.find() ... results.close()
테일 커서(tailable cursor)
고정 사이즈 고정 사이즈 컬렉션 을 쿼리할 때는 클라이언트 가 커서 의 결과를 모두 사용한 후에도 계속 열려 있는 테일 커서( tailable cursor )를 사용할 수 있습니다. 고정 사이즈 고정 사이즈 컬렉션 을 사용하여 테일 커서( tailable cursor )를 만들려면 find()
메서드의 cursor_type
옵션에 CursorType.TAILABLE_AWAIT
를 지정합니다.
다음 예제에서는 테일 커서(tailable cursor)를 사용하여 복제본 세트 멤버의 oplog를 추적합니다.
oplog = client.local.oplog.rs first = oplog.find().sort('$natural', pymongo.ASCENDING).limit(-1).next() print(first) ts = first['ts'] while True: cursor = oplog.find({'ts': {'$gt': ts}}, cursor_type=pymongo.CursorType.TAILABLE_AWAIT) while cursor.alive: for doc in cursor: ts = doc['ts'] print(doc) # You end up here if the find() method returns no documents, or if # no new documents are added to the collection for more than 1 second. time.sleep(1)
테일 커서(tailable cursor)에 대해 자세히 알아보려면 매뉴얼의 테일 커서(tailable cursor) 가이드 를 MongoDB Server 참조하세요.
문제 해결
'Cursor' 객체에 '_Cursor__killed' 속성이 없습니다.
PyMongo v3.8 이전 버전에서는 Cursor
생성자에 잘못된 인수를 제공하면 TypeError
및 AttributeError
가 발생합니다. AttributeError
는 관련이 없지만 TypeError
에는 다음 예제와 같이 디버깅 정보가 포함되어 있습니다.
Exception ignored in: <function Cursor.__del__ at 0x1048129d8> ... AttributeError: 'Cursor' object has no attribute '_Cursor__killed' ... TypeError: __init__() got an unexpected keyword argument '<argument>'
이 문제를 해결하려면 올바른 키워드 인수를 제공했는지 확인하세요. 관련 없는 오류를 제거하면 PyMongo v3.9 이상으로 업그레이드할 수도 있습니다.
" 서버 에서CursorNotFound 커서 ID가 유효하지 않습니다 "
MongoDB의 커서는 아무런 작업도 수행되지 않은 상태에서 오랫동안 열려 있는 경우 서버에서 시간 초과가 발생할 수 있습니다. 이로 인해 커서를 반복하려고 할 때 CursorNotFound
예외가 발생할 수 있습니다.