에서 커서 반복 mongosh
이 페이지의 내용
db.collection.find()
메서드는 커서를 반환합니다. 문서에 액세스하려면 커서를 반복적으로 움직여야 합니다. 그러나 mongosh
에서 반환된 커서가 var
키워드를 사용하여 변수에 할당되지 않은 경우 커서가 자동으로 최대 20회 [1] 반복되어 결과에 최대 처음 20개 문서를 출력합니다.
다음 예시는 문서에 액세스하거나 iterator 인덱스를 사용하기 위해 커서를 수동으로 반복하는 방법을 설명합니다.
커서 수동 반복
mongosh
에서는 find()
메서드에서 반환된 커서를 var
키워드를 사용하여 변수에 할당하면 커서가 자동으로 반복되지 않습니다.
아래 예시와 같이 셸에서 커서 변수를 호출하여 최대 20회[1] 까지 반복하고 일치하는 문서를 인쇄할 수 있습니다.
var myCursor = db.users.find( { type: 2 } ); myCursor
다음 예시에서와 같이 커서 메서드 next()
를 사용하여 문서에 액세스할 수도 있습니다:
var myCursor = db.users.find( { type: 2 } ); while (myCursor.hasNext()) { print(tojson(myCursor.next())); }
대체 인쇄 작업으로서 printjson()
를 대체하는 print(tojson())
헬퍼 메서드를 고려합니다.
var myCursor = db.users.find( { type: 2 } ); while (myCursor.hasNext()) { printjson(myCursor.next()); }
다음 예시와 같이 커서 메서드 forEach()
를 사용하여 커서를 반복하고 문서에 액세스할 수 있습니다.
var myCursor = db.users.find( { type: 2 } ); myCursor.forEach(printjson);
커서 메서드에 대한 자세한 내용은 JavaScript 커서 메서드 및 드라이버 설명서에서 확인 가능합니다.
[1] | (1, 2) DBQuery.shellBatchSize 속성을 설정하여 문서 수 기본값 20 을 변경할 수 있습니다. |
iterator 인덱스
mongosh
에서 toArray()
메서드를 사용하여 다음과 같이 커서를 반복하고 문서를 배열로 반환할 수 있습니다.
var myCursor = db.inventory.find( { type: 2 } ); var documentArray = myCursor.toArray(); var myDocument = documentArray[3];
toArray()
메서드는 커서가 반환한 모든 문서를 RAM에 불러오고, toArray()
메서드는 커서를 소진합니다.
또한 일부 드라이버는 커서의 인덱스를 사용하여 문서에 액세스할 수 있습니다(예: cursor[index]
). 이는 toArray()
메서드를 먼저 호출한 후 결과 배열의 인덱스를 사용하기 위한 빠른 방법입니다.
다음 예를 고려하십시오.
var myCursor = db.users.find( { type: 2 } ); var myDocument = myCursor[1];
myCursor[1]
은 다음 예시와 동일합니다.
myCursor.toArray() [1];
커서 동작
세션 내에서 열린 커서
MongoDB 5.0부터 클라이언트 세션 내에서 생성된 커서는 해당 서버 세션이 killSessions
명령으로 종료되거나 세션 시간이 초과 또는 클라이언트가 커서를 모두 사용한 경우 닫힙니다.
서버 세션의 만료 시간은 기본적으로 30분입니다. 이 값을 변경하려면 mongod
를 시작할 때 localLogicalSessionTimeoutMinutes
매개 변수를 설정합니다.
세션 외부에서 열린 커서
세션에서 열리지 않은 커서는 10분 동안 활동이 없거나 클라이언트가 커서를 소진한 경우 자동으로 닫힙니다. mongosh
에서 이 동작을 재정의하려면 cursor.noCursorTimeout()
메서드를 사용할 수 있습니다.
var myCursor = db.users.find().noCursorTimeout();
noCursorTimeout
옵션을 설정한 후에는 cursor.close()
를 사용하거나 커서를 소진하는 방법으로 수동으로 닫아야 합니다.
noCursorTimeout
옵션 설정에 관한 정보는 드라이버 문서에서 확인 가능합니다.
커서 격리
커서가 문서를 반환하면 다른 작업이 쿼리에 끼어들 수 있습니다.
커서 배치
MongoDB 서버는 쿼리 결과를 배치로 반환합니다. 배치의 데이터 양은 최대 BSON 문서 크기를 초과하지 않습니다. 배치의 기본 크기를 재정의하려면 batchSize()
및 limit()
을 확인합니다.
find()
, aggregate()
, listIndexes
, listCollections
유형의 작업은 배치당 최대 16메가바이트를 반환합니다. batchSize()
는 실행 한도를 축소할 수는 있지만 확대할 수는 없습니다.
find()
및 aggregate()
작업의 초기 배치 크기는 기본적으로 문서 101건입니다. 결과 커서에 대해 실행되는 후속 getMore
작업에는 기본 배치 크기가 없으므로 메시지 크기 제한 16메가바이트만 적용됩니다.
인덱스 없이 정렬 작업을 포함하는 쿼리의 경우 서버는 메모리에 있는 모든 문서를 불러와서 정렬을 수행한 후 결과를 반환해야 합니다.
커서를 반복하여 반환된 배치의 끝에 도달할 때 추가 결과가 존재하는 경우 cursor.next()
가 getMore operation
을 수행하여 다음 배치를 검색합니다. 커서를 반복할 때 배치에 남아 있는 문서의 수를 확인하려면 다음 예시에서와 같이 objsLeftInBatch()
메서드를 사용합니다.
var myCursor = db.inventory.find(); var myFirstDocument = myCursor.hasNext() ? myCursor.next() : null; myCursor.objsLeftInBatch();
커서 정보
db.serverStatus()
메서드는 metrics
필드가 포함된 문서를 반환합니다. metrics
필드에는 다음 정보와 함께 metrics.cursor
필드가 포함됩니다.
마지막 서버가 재시작된 이후 시간이 초과된 커서의 수
일정 시간 동안 사용하지 않은 후 시간 만료를 방지하기 위해
DBQuery.Option.noTimeout
옵션을 적용한 열린 커서 수'고정된' 커서 수
열린 커서의 총 개수
다음 예시를 살펴보면 db.serverStatus()
메서드를 호출하고 결과에서 metrics
필드에 액세스한 다음 metrics
필드에서 cursor
필드에 액세스합니다.
db.serverStatus().metrics.cursor
다음 문서와 같은 결과를 얻을 수 있습니다.
{ "timedOut" : <number> "open" : { "noTimeout" : <number>, "pinned" : <number>, "total" : <number> } }