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

MongoDB에서 $addFields와 $cond로 단어별 정렬 쿼리 작성하는 방법

MongoDB에서 특정 단어(문자열)를 기준으로 문서를 정렬하려면 집계 파이프라인의 $addFields 연산자와 $cond 조건식을 함께 활용하면 됩니다. 핵심 아이디어는 각 문서에 임시 정렬용 숫자 필드를 추가하고, 그 값을 기준으로 원하는 순서대로 정렬하는 것입니다.

1. 샘플 컬렉션 생성하기

먼저 demo62라는 이름의 컬렉션을 만들고 문서를 삽입해 보겠습니다.

> db.demo62.insertOne({"Subject":"MySQL"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e287084cfb11e5c34d8992f")
}
> db.demo62.insertOne({"Subject":"MongoDB"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e287085cfb11e5c34d89930")
}
> db.demo62.insertOne({"Subject":"Java"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e287086cfb11e5c34d89931")
}

2. find() 메서드로 전체 문서 조회하기

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

> db.demo62.find();

위 명령을 실행하면 다음과 같은 출력 결과가 나타납니다.

{ "_id" : ObjectId("5e287084cfb11e5c34d8992f"), "Subject" : "MySQL" }
{ "_id" : ObjectId("5e287085cfb11e5c34d89930"), "Subject" : "MongoDB" }
{ "_id" : ObjectId("5e287086cfb11e5c34d89931"), "Subject" : "Java" }

3. 단어 기준으로 정렬하는 쿼리 작성하기

다음은 $addFields와 $cond를 조합해 단어별로 정렬하는 쿼리입니다. Subject 값이 "MongoDB"이면 0, "MySQL"이면 1, 그 외의 값에는 2를 부여한 뒤, 이 새로운 필드인 sortByWords를 오름차순으로 정렬합니다.

> db.demo62.aggregate([
...    {
...       $addFields: {
...          sortByWords: {
...             $cond: [
...                { $eq: ["$Subject", "MongoDB"] },
...                0,
...                { $cond: [{ $eq: ["$Subject", "MySQL"] }, 1, 2] }
...             ]
...          }
...       }
...    },
...
...    {
...       $sort: {
...          sortByWords: 1
...       }
...    }
... ]);

4. 실행 결과 확인하기

쿼리를 실행하면 지정한 단어 순서(MongoDB → MySQL → Java)대로 문서가 정렬된 것을 확인할 수 있습니다.

{ "_id" : ObjectId("5e287085cfb11e5c34d89930"), "Subject" : "MongoDB", "sortByWords" : 0 }
{ "_id" : ObjectId("5e287084cfb11e5c34d8992f"), "Subject" : "MySQL", "sortByWords" : 1 }
{ "_id" : ObjectId("5e287086cfb11e5c34d89931"), "Subject" : "Java", "sortByWords" : 2 }

동작 원리 요약

$cond는 조건을 평가하여 참일 때와 거짓일 때 서로 다른 값을 반환하는 조건 연산자입니다. 위 예제에서는 중첩된 $cond를 통해 세 가지 경우의 수를 처리했으며, 각 조건에 맞는 숫자값이 sortByWords 필드에 저장됩니다. 마지막으로 $sort 단계에서 이 필드를 기준으로 오름차순(1) 정렬을 수행함으로써, 알파벳순이 아닌 개발자가 의도한 단어 우선순위대로 결과를 얻을 수 있습니다. 이 기법은 특정 카테고리나 상태 값을 우선적으로 노출해야 하는 목록 조회에 매우 유용합니다.