MongoDB에서 특정 개수의 값을 건너뛰고 결과를 가져오려면 skip() 메서드와 함께 limit() 메서드를 사용하면 됩니다. 예를 들어 5개의 값을 건너뛰려면 limit(5)를 지정하면 되는데, 실제로는 페이징(paging) 처리 시 자주 활용되는 패턴입니다.
테스트 컬렉션 생성하기
먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.demo633.insertOne({"Value":10});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c0be76c954c74be91e6c1")
}
> db.demo633.insertOne({"Value":20});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c0bea6c954c74be91e6c2")
}
> db.demo633.insertOne({"Value":30});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c0bec6c954c74be91e6c3")
}
> db.demo633.insertOne({"Value":40});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c0bef6c954c74be91e6c4")
}
> db.demo633.insertOne({"Value":50});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c0bf16c954c74be91e6c5")
}
> db.demo633.insertOne({"Value":60});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c0bf36c954c74be91e6c6")
}
> db.demo633.insertOne({"Value":70});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c0bf86c954c74be91e6c7")
}
> db.demo633.insertOne({"Value":80});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c0bfa6c954c74be91e6c8")
}저장된 문서 전체 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo633.find();
위 쿼리를 실행하면 다음과 같은 출력 결과가 나타납니다.
{ "_id" : ObjectId("5e9c0be76c954c74be91e6c1"), "Value" : 10 }
{ "_id" : ObjectId("5e9c0bea6c954c74be91e6c2"), "Value" : 20 }
{ "_id" : ObjectId("5e9c0bec6c954c74be91e6c3"), "Value" : 30 }
{ "_id" : ObjectId("5e9c0bef6c954c74be91e6c4"), "Value" : 40 }
{ "_id" : ObjectId("5e9c0bf16c954c74be91e6c5"), "Value" : 50 }
{ "_id" : ObjectId("5e9c0bf36c954c74be91e6c6"), "Value" : 60 }
{ "_id" : ObjectId("5e9c0bf86c954c74be91e6c7"), "Value" : 70 }
{ "_id" : ObjectId("5e9c0bfa6c954c74be91e6c8"), "Value" : 80 }쿼리를 분할하여 5개 값 건너뛰기
이제 쿼리를 페이지 단위로 분할하면서 앞의 5개 값을 건너뛰는 방법을 살펴보겠습니다. 페이지 크기를 5로 가정할 때, 변수에 원하는 페이지 번호를 담고 (dividePage - 1) * 5 공식으로 건너뛸 문서 수를 계산합니다.
> var dividePage=2; > db.demo633.find().skip((dividePage-1)*5).limit(5);
위 코드는 2페이지에 해당하는 데이터를 가져옵니다. 즉, 첫 번째 5개 문서(10~50)를 건너뛴 뒤 최대 5개의 문서만 반환하므로, 남아 있는 마지막 3개 문서가 출력됩니다.
{ "_id" : ObjectId("5e9c0bf36c954c74be91e6c6"), "Value" : 60 }
{ "_id" : ObjectId("5e9c0bf86c954c74be91e6c7"), "Value" : 70 }
{ "_id" : ObjectId("5e9c0bfa6c954c74be91e6c8"), "Value" : 80 }정리
skip(n)은 앞에서부터 n개의 문서를 무시하고, limit(m)은 최대 m개의 문서만 반환합니다. 이 두 메서드를 조합하면 skip((페이지번호 - 1) × 페이지크기).limit(페이지크기) 형태로 손쉽게 페이징 로직을 구현할 수 있습니다. 다만 데이터 양이 매우 클 경우 skip()은 성능 저하를 일으킬 수 있으므로, 대규모 컬렉션에서는 범위 기반(range-based) 페이징을 고려하는 것이 좋습니다.