MongoDB에서 새 필드 추가 및 가격 나누기 결과 연결하기
MongoDB에서 기존 문서에 새로운 필드를 추가하려면 애그리게이션 파이프라인의 $addFields 연산자를 사용합니다. 이번 글에서는 배열 안에 있는 상품 가격들을 특정 숫자(예: 5)로 나눈 뒤, 그 결과를 하나의 문자열로 연결하여 새 필드에 저장하는 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성 및 문서 삽입
먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입합니다.
> db.demo719.insertOne(
... {
... "Number":"7374644",
... "details" : {
... "otherDetails" : [
... {
... "ProductId" :"102",
... "ProductPrice" : NumberInt(500)
... },
... {
... "ProductId" :"103",
... "ProductPrice" : NumberInt(2000)
... }
... ]
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5eaae56c43417811278f5882")
}위 문서는 주문 번호(Number)와 함께, 각 상품의 ID와 가격(ProductPrice)이 배열 형태로 담겨 있는 구조입니다.
2. find() 메서드로 전체 문서 조회하기
삽입된 모든 문서는 find() 메서드를 통해 확인할 수 있습니다.
> db.demo719.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5eaae56c43417811278f5882"), "Number" : "7374644", "details" : { "otherDetails" : [ { "ProductId" : "102", "ProductPrice" : 500 }, { "ProductId" : "103", "ProductPrice" : 2000 } ] } }3. 새 필드를 추가하고 가격 나누기 결과를 연결하는 쿼리
이제 핵심인 애그리게이션 쿼리입니다. $addFields로 새 필드(productPriceList)를 만들고, 그 안에서 여러 연산자를 조합하여 가격을 나눈 결과를 문자열로 이어 붙입니다.
> db.demo719.aggregate([
... {
... $addFields:{
... productPriceList: {
... $reduce: {
... input: {
... $map: {
... input: "$details.otherDetails.ProductPrice",
... in: { $toString: { $divide: ["$$this", 5] } }
... }
... },
... initialValue: "",
... in: { $concat: ["$$value", "$$this", " \n "] }
... }
... }
... }
... },
... {
... $project: {
... _id: 0,
... Number:1,
... productPriceList:1
... }
... }
... ])실행 결과는 다음과 같습니다.
{ "Number" : "7374644", "productPriceList" : "100 \n 400 \n " }쿼리 동작 원리 살펴보기
각 연산자가 어떤 역할을 하는지 정리하면 다음과 같습니다.
$map: details.otherDetails 배열에서 ProductPrice 값들만 추출한 뒤, 각 값을 5로 나눕니다($divide). 이때 $toString으로 나눈 결과를 문자열로 변환합니다. 예를 들어 500은 100으로, 2000은 400으로 변환됩니다.
$reduce: $map이 반환한 문자열 배열을 순회하면서 초기값("")부터 시작해 각 요소를 $concat으로 연결합니다. 값 사이에는 줄바꿈 문자(\n)가 삽입되어 결과가 보기 좋게 구분됩니다.
$project: 최종 출력에서 _id 필드는 제외(_id: 0)하고, Number와 새로 만든 productPriceList 필드만 포함(1)하도록 결과 형태를 조정합니다.
이처럼 $addFields, $map, $reduce, $concat 등의 연산자를 조합하면 복잡한 데이터 변환 작업도 하나의 애그리게이션 파이프라인 안에서 손쉽게 처리할 수 있습니다.