Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 $skip과 $limit으로 고유하게 정렬된 레코드 표시하기

MongoDB에서 중복을 제거한 고유한 값들을 정렬된 순서로 조회하면서 일부 레코드를 건너뛰고 개수를 제한하려면 애그리게이션(집계) 프레임워크를 활용하면 됩니다. $group, $sort, $skip, $limit 연산자를 조합하면 손쉽게 구현할 수 있습니다.

먼저 예제에 사용할 컬렉션을 생성하고 문서를 삽입해 보겠습니다.

컬렉션 생성 및 문서 삽입

> db.orderedDistinctDemo.insertOne({"Name":"John"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ccfb8e0140b992277dae0e9")
}
> db.orderedDistinctDemo.insertOne({"Name":"Larry"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ccfb8e5140b992277dae0ea")
}
> db.orderedDistinctDemo.insertOne({"Name":"Larry"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ccfb8e7140b992277dae0eb")
}
> db.orderedDistinctDemo.insertOne({"Name":"Sam"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ccfb8ea140b992277dae0ec")
}
> db.orderedDistinctDemo.insertOne({"Name":"John"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ccfb8ee140b992277dae0ed")
}
> db.orderedDistinctDemo.insertOne({"Name":"Carol"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ccfb8f2140b992277dae0ee")
}
> db.orderedDistinctDemo.insertOne({"Name":"David"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ccfb8f6140b992277dae0ef")
}
> db.orderedDistinctDemo.insertOne({"Name":"Carol"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ccfb8f9140b992277dae0f0")
}

총 8개의 문서가 삽입되었습니다. 이름을 살펴보면 "John", "Larry", "Carol"이 각각 두 번씩 등장하는 것을 확인할 수 있습니다.

find() 메서드로 전체 문서 확인

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.

> db.orderedDistinctDemo.find().pretty();

위 쿼리는 다음과 같은 결과를 출력합니다.

{ "_id" : ObjectId("5ccfb8e0140b992277dae0e9"), "Name" : "John" }
{ "_id" : ObjectId("5ccfb8e5140b992277dae0ea"), "Name" : "Larry" }
{ "_id" : ObjectId("5ccfb8e7140b992277dae0eb"), "Name" : "Larry" }
{ "_id" : ObjectId("5ccfb8ea140b992277dae0ec"), "Name" : "Sam" }
{ "_id" : ObjectId("5ccfb8ee140b992277dae0ed"), "Name" : "John" }
{ "_id" : ObjectId("5ccfb8f2140b992277dae0ee"), "Name" : "Carol" }
{ "_id" : ObjectId("5ccfb8f6140b992277dae0ef"), "Name" : "David" }
{ "_id" : ObjectId("5ccfb8f9140b992277dae0f0"), "Name" : "Carol" }

$skip과 $limit을 적용한 집계 쿼리 작성

이제 이름(Name) 필드를 기준으로 그룹화하여 고유한 값만 추출하고, 오름차순으로 정렬한 뒤 3개의 레코드를 건너뛰고 최대 8개까지 표시하는 쿼리를 작성해 보겠습니다.

> db.orderedDistinctDemo.aggregate(
...    { $group : { _id : "$Name" }},
...    { $sort : { _id: 1 }},
...    { $skip : 3 },
...    { $limit : 8 }
... );

이 쿼리는 다음과 같은 출력을 생성합니다.

{ "_id" : "Larry" }
{ "_id" : "Sam" }

결과 분석

고유한 이름들을 알파벳 오름차순으로 정렬하면 Carol, David, John, Larry, Sam 순서가 됩니다. 여기서 $skip : 3에 의해 앞의 세 항목(Carol, David, John)이 건너뛰어지고, $limit : 8은 남은 항목 수보다 크기 때문에 결과적으로 Larry와 Sam만 반환됩니다.

이처럼 $group으로 중복을 제거하고, $sort로 정렬한 다음, $skip$limit을 조합하면 정렬된 고유 레코드에 대한 페이지네이션을 간편하게 구현할 수 있습니다.