MongoDB에서 특정 레코드를 건너뛰려면 skip() 메서드를 사용하고, 건너뛴 후 일정 개수의 레코드만 표시하려면 limit() 메서드를 함께 사용합니다. 이 두 메서드를 조합하면 대량의 데이터 중에서 원하는 구간의 문서만 효율적으로 조회할 수 있으며, 페이지네이션(pagination) 기능을 구현할 때도 자주 활용됩니다.
1. 예제용 컬렉션 생성
먼저 실습에 사용할 문서들이 담긴 컬렉션을 생성해 보겠습니다.
> db.demo275.insertOne({"Number":10});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e48eac4dd099650a5401a43")
}
> db.demo275.insertOne({"Number":12});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e48eac7dd099650a5401a44")
}
> db.demo275.insertOne({"Number":6});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e48eac9dd099650a5401a45")
}
> db.demo275.insertOne({"Number":1});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e48eacadd099650a5401a46")
}
> db.demo275.insertOne({"Number":5});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e48eacddd099650a5401a47")
}
> db.demo275.insertOne({"Number":24});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e48ead0dd099650a5401a48")
}
> db.demo275.insertOne({"Number":8});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e48ead6dd099650a5401a49")
}
> db.demo275.insertOne({"Number":9});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e48ead8dd099650a5401a4a")
}
> db.demo275.insertOne({"Number":19});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e48eadddd099650a5401a4b")
}
> db.demo275.insertOne({"Number":29});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e48eae1dd099650a5401a4c")
}2. find()로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo275.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e48eac4dd099650a5401a43"), "Number" : 10 }
{ "_id" : ObjectId("5e48eac7dd099650a5401a44"), "Number" : 12 }
{ "_id" : ObjectId("5e48eac9dd099650a5401a45"), "Number" : 6 }
{ "_id" : ObjectId("5e48eacadd099650a5401a46"), "Number" : 1 }
{ "_id" : ObjectId("5e48eacddd099650a5401a47"), "Number" : 5 }
{ "_id" : ObjectId("5e48ead0dd099650a5401a48"), "Number" : 24 }
{ "_id" : ObjectId("5e48ead6dd099650a5401a49"), "Number" : 8 }
{ "_id" : ObjectId("5e48ead8dd099650a5401a4a"), "Number" : 9 }
{ "_id" : ObjectId("5e48eadddd099650a5401a4b"), "Number" : 19 }
{ "_id" : ObjectId("5e48eae1dd099650a5401a4c"), "Number" : 29 }총 10개의 문서가 순서대로 출력되는 것을 확인할 수 있습니다.
3. skip()과 limit()으로 처음 5개 건너뛰기
이제 처음 5개 레코드를 건너뛰고 나머지 5개만 표시하는 쿼리를 살펴보겠습니다. skip(5)는 앞의 5개 문서를 무시하도록 지정하고, 이어서 limit(5)는 그 이후 최대 5개의 문서만 반환하도록 제한합니다.
> db.demo275.find().skip(5).limit(5)
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e48ead0dd099650a5401a48"), "Number" : 24 }
{ "_id" : ObjectId("5e48ead6dd099650a5401a49"), "Number" : 8 }
{ "_id" : ObjectId("5e48ead8dd099650a5401a4a"), "Number" : 9 }
{ "_id" : ObjectId("5e48eadddd099650a5401a4b"), "Number" : 19 }
{ "_id" : ObjectId("5e48eae1dd099650a5401a4c"), "Number" : 29 }정리
앞선 5개 문서(Number 값이 10, 12, 6, 1, 5인 레코드)는 건너뛰어지고, 6번째부터 10번째까지의 문서만 결과로 반환되었습니다. 이처럼 skip(n)은 n개의 문서를 건너뛰고, limit(m)은 m개의 문서만 가져오므로, 두 메서드를 조합하면 원하는 위치의 데이터 구간을 손쉽게 조회할 수 있습니다. 게시판 목록이나 피드처럼 페이지 단위로 데이터를 나눠 보여주는 서비스를 개발할 때 매우 유용한 패턴이니 꼭 기억해 두세요.