문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

cursor.skip()

이 페이지의 내용

  • 정의
  • 행동
  • 페이지 매김 예제
cursor.skip(<offset>)

중요

Mongo쉬 방법

이는 mongosh 메서드입니다. 이는 Node.js 또는 기타 프로그래밍 언어별 드라이버 메서드에 대한 설명서가 아닙니다 .

대부분의 경우 mongosh 메서드는 레거시 mongo 셸 메서드와 동일한 방식으로 작동합니다. 그러나 일부 레거시 메서드는 mongosh 에서 사용할 수 없습니다.

레거시 mongo 셸 문서는 해당 MongoDB 서버 릴리스 문서를 참조하세요.

MongoDB API 드라이버의 경우 언어별 MongoDB 드라이버 설명서를 참조하세요.

커서에서 skip() 메서드를 호출하여 MongoDB가 결과를 반환하기 시작하는 위치를 제어합니다. 이 접근 방식은 페이지가 매겨진 결과를 구현할 때 유용할 수 있습니다.

참고

데이터베이스에서 문서를 검색하기 전에 커서에 skip() 를 적용해야 합니다.

skip() 메서드에는 다음과 같은 매개 변수가 있습니다.

매개변수
유형
설명
offset
숫자
결과 세트에서 건너뛸 문서 수입니다.

skip()sort() 와 함께 사용하는 경우 결과를 skip() 에 전달하기 전에 고유 값이 포함된 필드를 정렬에 포함해야 합니다.

중복 값이 포함된 필드를 기준으로 정렬하면 특히 컬렉션이 활발하게 쓰기를 수신하는 경우 여러 번 실행할 때 중복 필드에 대해 일관되지 않은 정렬 순서가 반환될 수 있습니다.

정렬 일관성을 보장하는 가장 쉬운 방법은 정렬 쿼리에 _id 필드를 포함하는 것입니다.

자세한 내용은 sort () 메서드를 사용한 일관적인 정렬을 참조하세요.

skip()limit() 를 연결할 때 메서드 연결 순서는 결과에 영향을 주지 않습니다. 서버는 반환할 문서 수에 제한을 적용하기 전에 항상 정렬 순서를 기반으로 건너뛰기 작업을 적용합니다.

다음 코드 예시에서는 동일한 데이터 세트에 대해 항상 동일한 쿼리 결과를 생성하는 skip()limit() 에 대한 다양한 연결 순서를 보여 줍니다.

db.myColl.find().sort({_id: 1}).skip(3).limit(6);
db.myColl.find().sort({_id: 1}).limit(6).skip(3);

다음 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와 같은 필드를 선택합니다.

  • $ltsort() 연산자를 사용하여 필드가 시작 값보다 작은 문서를 쿼리합니다.

  • 다음 쿼리를 위해 마지막으로 본 필드 값을 저장합니다.

예를 들어, 다음 함수는 위의 절차를 사용하여 컬렉션에서 학생 이름 페이지를 인쇄합니다. 이 페이지는 먼저 _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);
}

참고

객체 ID 값은 시간이 지남에 따라 증가해야 하지만 반드시 단조적이지는 않습니다. 그 이유는 다음과 같습니다.

  • 1초의 임시 확인만 포함하므로 동일한 초 내에 생성된 객체 ID 값은 순서가 보장되지 않습니다.

  • 클라이언트에서 생성되며, 시스템 클럭이 다를 수 있습니다.

페이지가 매겨진 결과를 오름차순으로 반환하는 것은 이전과 비슷하지만 오름차순 정렬 순서로 $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);
}
← cursor.size()