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

MongoDB 집계(Aggregation)에서 정수 배열을 하나의 문자열로 연결하는 방법

MongoDB에서 정수형 배열을 하나의 문자열로 합치려면 aggregate() 파이프라인 내에서 $concat 연산자를 활용하면 됩니다. 아래 예제를 통해 전체 과정을 단계별로 살펴보겠습니다.

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

먼저 테스트에 사용할 컬렉션을 만들고 정수 배열을 포함한 문서를 하나 삽입합니다.

> db.demo377.insertOne({"ListOfIds":[1001,1002,1003,1004,1005,1006,1007]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e5a73462ae06a1609a00b0e")
}

2단계: 저장된 문서 확인

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

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

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

{
   "_id" : ObjectId("5e5a73462ae06a1609a00b0e"),
   "ListOfIds" : [
      1001,
      1002,
      1003,
      1004,
      1005,
      1006,
      1007
   ]
}

3단계: 집계 파이프라인으로 배열 연결하기

다음은 $reduce, $let, $concat 등을 조합하여 정수 배열을 하나의 문자열로 연결하는 집계 쿼리입니다.

> db.demo377.aggregate([
...    { "$project": {
...       "ListOfIds": {
...          "$let": {
...             "vars": {
...                "key": {
...                   "$reduce": {
...                      "input": "$ListOfIds",
...                      "initialValue": "",
...                      "in": { "$concat": ["$$value", "++", { "$toLower": "$$this" }] }
...                   }
...                }
...             },
...             "in": { "$substrCP": ["$$key", 2, { "$strLenCP": "$$key" }] }
...          }
...       }
...    }}
... ])

쿼리 동작 원리

  • $reduce: 배열의 각 요소를 순회하면서 누적값($$value)에 현재 요소($$this)를 이어 붙입니다.
  • $toLower: 정수 요소를 문자열로 변환합니다. $concat은 문자열만 처리할 수 있기 때문에 반드시 필요한 과정입니다.
  • $concat: 누적값과 현재 요소 사이에 구분자 "++"를 넣어 하나의 문자열로 연결합니다.
  • $substrCP: 첫 번째 요소 앞에 불필요하게 붙은 구분자(앞 2글자)를 잘라내어 최종 결과를 깔끔하게 정리합니다.

4단계: 최종 출력 결과

쿼리를 실행하면 정수 배열이 다음과 같이 하나의 문자열로 연결됩니다.

{ "_id" : ObjectId("5e5a73462ae06a1609a00b0e"), "ListOfIds" : "1001++1002++1003++1004++1005++1006++1007" }

이처럼 MongoDB의 집계 프레임워크에서는 $reduce$concat을 조합하면 별도의 애플리케이션 로직 없이도 배열 요소를 원하는 구분자로 손쉽게 연결할 수 있습니다. 구분자를 쉼표나 공백 등으로 바꾸고 싶다면 $concat 안의 "++" 부분만 수정하면 됩니다.