커서에서 데이터 액세스
개요
여러 문서를 반환하는 읽기 작업은 쿼리와 일치하는 모든 값을 즉시 반환하지 않습니다. 쿼리는 잠재적으로 매우 큰 문서 세트와 일치할 수 있으므로 이러한 작업은 커서라는 객체에 의존합니다. 커서는 메모리 소비와 네트워크 대역폭 사용량을 모두 줄이기 위해 문서를 배치로 가져옵니다. 커서는 고도로 구성 가능하며 다양한 사용 사례에 대한 여러 상호 작용 패러다임을 제공합니다.
다음 함수는 커서를 직접 반환합니다.
Collection.find()
Collection.aggregate()
Collection.listIndexes()
Collection.listSearchIndexes()
Db.aggregate()
Db.listCollections()
Collection.findOne() 및 Collection.watch()와 같은 기타 메서드는 내부적으로 커서를 사용하고 커서 대신 작업 결과를 반환합니다.
커서 패러다임
여러 커서 패러다임을 사용하여 커서에 대해 작업할 수 있습니다. 대부분의 커서 패러다임은 네트워크 및 캐싱 로직을 추상화하여 한 번에 한 문서씩 쿼리 결과에 액세스할 수 있습니다. 그러나 사용 사례가 다양하기 때문에 다른 패러다임에서는 일치하는 모든 문서를 프로세스 메모리의 컬렉션으로 가져오는 것과 같은 다른 액세스 패턴을 제공합니다.
경고
하나의 커서에 서로 다른 커서 패러다임을 결합하지 않습니다. hasNext()
및 toArray()
같은 연산은 각각 원래 커서를 예측 가능하게 수정합니다. 하나의 커서에서 해당 호출을 혼합하면 예상치 못한 결과가 나타날 수 있습니다.
경고
비동기 호출은 커서를 직접 수정하기 때문에 하나의 커서에서 비동기 호출을 동시에 실행하면 정의되지 않은 동작이 발생할 수도 있습니다. 항상 다른 비동기 작업을 실행하기 전에 이전 비동기 작업이 완료될 때까지 기다립니다.
참고
반복 또는 한 번에 가져 오기를 통해 마지막 결과에 도달하면 커서가 소진되어 결과에 액세스하는 메서드에 응답하지 않습니다.
비동기 반복
커서는 AsyncIterator 인터페이스를 구현하며, 이를 통해 for await...of
루프에서 커서를 사용할 수 있습니다.
const cursor = myColl.find({}); console.log("async"); for await (const doc of cursor) { console.log(doc); }
수동 반복
hasNext() 메서드를 사용하여 커서가 추가 데이터를 제공할 수 있는지 확인한 다음 다음() 메서드를 사용합니다. 메서드를 사용하여 커서의 후속 요소를 조회합니다.
const cursor = myColl.find({}); while (await cursor.hasNext()) { console.log(await cursor.next()); }
모든 문서 배열 반환
쿼리와 일치하는 모든 문서를 동시에 메모리에 보관해야 하는 사용 사례의 경우 toArray() 메서드를 사용하세요. 일치하는 문서 수가 많으면 작업이 메모리 제약 조건을 초과하는 경우 성능 문제나 실패가 발생할 수 있습니다. 모든 문서를 한 번에 반환하는 대신 for await...of
구문을 사용하여 결과를 반복하는 것을 고려해 보세요.
const cursor = myColl.find({}); const allValues = await cursor.toArray();
Stream API
커서는 stream()
메서드를 노출하여 노드 읽기 가능 스트림으로 변환합니다. 이러한 스트림은 파이프라인을 통해 버퍼나 문자열이 아닌 JavaScript 객체를 전달하는 객체 모드에서 작동합니다.
const cursor = myColl.find({}); cursor.stream().on("data", doc => console.log(doc));
이벤트 API
읽기 가능한 스트림인 커서는 이벤트 API의 close
, data
, end
및 readable
이벤트도 지원합니다:
const cursor = myColl.find({}); // the "data" event is fired once per document cursor.on("data", data => console.log(data));
커서 유틸리티 메서드
되감기
반환된 문서 집합의 초기 위치로 커서를 재설정하려면 rewind()를 사용합니다.
const cursor = myColl.find({}); const firstResult = await cursor.toArray(); console.log("First count: " + firstResult.length); await cursor.rewind(); const secondResult = await cursor.toArray(); console.log("Second count: " + secondResult.length);
닫기
커서는 클라이언트 애플리케이션과 연결된 MongoDB 인스턴스 모두에서 메모리와 네트워크 리소스를 소비합니다. close() 사용 클라이언트 애플리케이션과 MongoDB 서버 모두에서 커서의 리소스를 확보하세요.
await cursor.close();