cursor.skip()
정의
cursor.skip(<offset>)
중요
Mongo쉬 방법
이 페이지에서는
mongosh
메서드를 설명합니다. 이는 Node.js와 같은 언어별 드라이버에 대한 설명서가 아닙니다.MongoDB API 드라이버의 경우 언어별 MongoDB 드라이버 설명서를 참조하세요.
커서에서
skip()
메서드를 호출하여 MongoDB가 결과를 반환하기 시작하는 위치를 제어합니다. 이 접근 방식은 페이지가 매겨진 결과를 구현할 때 유용할 수 있습니다.참고
데이터베이스에서 문서를 검색하기 전에 커서에
skip()
을 적용해야 합니다.skip()
메서드에는 다음과 같은 매개변수가 있습니다.Parameter유형설명offset
숫자결과 세트에서 건너뛸 문서 수입니다.
행동
와 함께 사용 skip()
sort()
skip()
및 sort()
를 함께 사용하는 경우 결과를 skip()
에 전달하기 전에 정렬 내 최소 한 개의 필드에 고유한 값이 포함되어 있는지 확인해야 합니다.
중복 값이 포함된 필드를 기준으로 정렬하면 특히 컬렉션이 활발하게 쓰기를 수신하는 경우 여러 번 실행할 때 중복 필드에 대해 일관되지 않은 정렬 순서가 반환될 수 있습니다.
정렬 일관성을 보장하는 가장 쉬운 방법은 정렬 쿼리에 _id
필드를 포함하는 것입니다.
자세한 내용은 sort () 메서드를 사용한 일관적인 정렬을 참조하세요.
와 함께 사용 skip()
limit()
skip()
과 limit()
를 연결할 때 메서드 연결 순서는 결과에 영향을 주지 않습니다. 서버는 반환할 문서 수에 제한을 적용하기 전에 항상 정렬 순서를 기반으로 건너뛰기 작업을 적용합니다.
다음 코드 예시에서는 동일한 데이터 세트에 항상 동일한 쿼리 결과를 생성하는 skip()
및 limit()
에 대한 다양한 연결 순서를 보여 줍니다.
db.myColl.find().sort({_id: 1}).skip(3).limit(6); db.myColl.find().sort({_id: 1}).limit(6).skip(3);
페이지 매김 예시
사용 skip()
다음 JavaScript 함수는 skip()
을 사용하여 컬렉션의 _id
필드를 기준으로 페이지를 매길 수 있습니다.
function printStudents(pageNumber, nPerPage) { print( "Page: " + pageNumber ); db.students.find() .sort( { _id: 1 } ) .skip( pageNumber > 0 ? ( ( pageNumber - 1 ) * nPerPage ) : 0 ) .limit( nPerPage ) .forEach( student => { print( student.name ); } ); }
skip()
메서드는 서버가 결과 반환을 시작하기 전에 서버가 입력 결과의 처음부터 스캔해야 합니다. 오프셋이 증가하면 skip()
이 느려집니다.
범위 쿼리 사용
범위 쿼리는 인덱스를 사용하여 원치 않는 문서를 스캔하지 않도록 할 수 있으며, 일반적으로 페이지 매김에 skip()
을 사용하는 것에 비해 오프셋이 커질수록 더 나은 성능을 제공합니다.
내림차순
범위 쿼리로 페이지 매김을 구현하려면 다음 절차를 따릅니다.
일반적으로 시간이 지남에 따라 일관된 방향으로 변경되고 중복 값을 방지하기 위한 고유 인덱스가 있는
_id
와 같은 필드를 선택합니다.다음 쿼리를 위해 마지막으로 본 필드 값을 저장합니다.
예를 들어, 다음 함수는 위의 절차를 사용하여 컬렉션에서 학생 이름 페이지를 인쇄합니다. 이 페이지는 먼저 _id
필드를 사용하여 최신 문서 순서대로 정렬됩니다(즉, 내림차순).
function printStudents(startValue, nPerPage) { let endValue = null; db.students.find( { _id: { $lt: startValue } } ) .sort( { _id: -1 } ) .limit( nPerPage ) .forEach( student => { print( student.name ); endValue = student._id; } ); return endValue; }
그런 다음 다음 코드를 사용하여 이 페이지 매김 함수를 사용하여 모든 학생 이름을 인쇄할 수 있으며, MaxKey
를 사용하여 가능한 가장 큰 키부터 시작할 수 있습니다.
let currentKey = MaxKey; while (currentKey !== null) { currentKey = printStudents(currentKey, 10); }
오름차순
페이지가 매겨진 결과를 오름차순으로 반환하는 것은 이전과 비슷하지만 오름차순 정렬 순서로 $gt
를 사용합니다.
function printStudents(startValue, nPerPage) { let endValue = null; db.students.find( { _id: { $gt: startValue } } ) .sort( { _id: 1 } ) .limit( nPerPage ) .forEach( student => { print( student.name ); endValue = student._id; } ); return endValue; }
이 함수를 사용하는 것도 비슷하지만 MinKey
를 시작 키로 사용합니다.
let currentKey = MinKey; while (currentKey !== null) { currentKey = printStudents(currentKey, 10); }