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

MongoDB 집계 프레임워크로 배열 길이 기준 정렬하기

MongoDB에서 배열 길이를 기준으로 문서 정렬하기

MongoDB에서 배열 필드의 요소 개수(길이)를 기준으로 문서를 정렬하려면 aggregate() 메서드를 사용합니다. 정렬에 앞서 $sum 연산자로 배열 내 레코드 수를 계산하고, $unwind로 배열을 개별 문서로 분해한 뒤 그룹화하는 과정을 거칩니다.

아래에서 전체 과정을 단계별로 살펴보겠습니다.

1단계: 컬렉션 생성 및 문서 삽입

먼저 데모용 컬렉션을 만들고 학생 목록 배열을 가진 문서들을 삽입합니다.

> db.demo33.insertOne({"ListOfStudent":["Chris","Bob"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e17556ccfb11e5c34d898ca")
}
> db.demo33.insertOne({"ListOfStudent":["David","Adam","Mike"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e17557acfb11e5c34d898cb")
}
> db.demo33.insertOne({"ListOfStudent":["Carol","Sam","John","Robert"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e1755a3cfb11e5c34d898cc")
}

2단계: find()로 전체 문서 조회

find() 메서드를 사용해 컬렉션의 모든 문서를 확인합니다.

> db.demo33.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e17556ccfb11e5c34d898ca"), "ListOfStudent" : [ "Chris", "Bob" ] }
{ "_id" : ObjectId("5e17557acfb11e5c34d898cb"), "ListOfStudent" : [ "David", "Adam", "Mike" ] }
{ "_id" : ObjectId("5e1755a3cfb11e5c34d898cc"), "ListOfStudent" : [ "Carol", "Sam", "John", "Robert" ] }

3단계: 배열 길이 기준 정렬 쿼리 실행

다음은 배열 길이를 기준으로 내림차순 정렬하는 집계 쿼리입니다.

> db.demo33.aggregate({$unwind:"$ListOfStudent"}, { $group : {_id:'$_id', ct:{$sum:1}}}, { $sort :{ ct: -1}} );

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e1755a3cfb11e5c34d898cc"), "ct" : 4 }
{ "_id" : ObjectId("5e17557acfb11e5c34d898cb"), "ct" : 3 }
{ "_id" : ObjectId("5e17556ccfb11e5c34d898ca"), "ct" : 2 }

쿼리 동작 원리

이 쿼리는 세 단계의 파이프라인으로 구성됩니다.

$unwind: 각 문서의 ListOfStudent 배열을 요소별로 분해하여, 배열 요소 하나당 하나의 문서를 생성합니다.
$group + $sum: _id를 기준으로 문서를 다시 묶고, $sum:1을 통해 각 배열에 속한 요소의 개수를 ct 필드에 카운트합니다.
$sort: ct 값을 기준으로 내림차순(-1) 정렬하여, 배열 길이가 긴 문서부터 출력합니다.

결과를 보면 요소가 4개인 문서, 3개인 문서, 2개인 문서 순서대로 정렬되어 출력된 것을 확인할 수 있습니다. 오름차순 정렬을 원한다면 $sort의 값을 1로 변경하면 됩니다.