MongoDB에서 새 필드 생성 및 다른 필드의 개수 설정하기
MongoDB에서 문서에 새로운 필드를 추가하려면 $addFields 연산자를 사용합니다. $addFields는 애그리게이션 파이프라인 단계에서 기존 문서에 새 필드를 추가하거나 기존 필드의 값을 변환할 때 활용되는 전용 연산자입니다.
아래 예제를 통해 details 배열 내 각 요소에 대해 다른 배열(details1)의 개수를 계산해 새 필드로 추가하는 방법을 살펴보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용해 컬렉션을 생성하고 문서를 삽입합니다.
> db.demo429.insertOne(
... {
... "_id": 101,
... "Value": 3,
... "details": [
... {
... "Age": 29,
... "Value": 3,
... "details1": [
... 1,
... 2,
... 3
... ]
... },
... {
... "Age": 31,
... "Value": 4,
... "details1": [
... 354
... ]
... }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 101 }
2. find() 메서드로 모든 문서 조회
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo429.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : 101, "Value" : 3, "details" : [ { "Age" : 29, "Value" : 3, "details1" : [ 1, 2, 3 ] }, { "Age" : 31, "Value" : 4, "details1" : [ 354 ] } ] }3. $addFields와 $map으로 새 필드 생성하기
다음은 details 배열 내 각 요소를 순회하면서 details1 배열의 크기를 계산하고, 그 결과를 NumberOfDetails1이라는 새 필드로 추가하는 쿼리입니다. 여기서 $map 연산자는 배열을 순회하는 역할을 하고, $size 연산자는 배열에 포함된 요소의 개수를 반환합니다.
> db.demo429.aggregate([
... {
... "$addFields": {
... "details" : {
... "$map": {
... "input": "$details",
... "as": "d",
... "in": {
... "Age" : "$$d.Age",
... "NumberOfDetails1": { "$size": "$$d.details1" }
... }
... }
... }
... }
... }
... ])
실행 결과는 다음과 같습니다. 각 details 항목에 details1 배열의 개수가 NumberOfDetails1 필드로 정상적으로 추가된 것을 확인할 수 있습니다.
{ "_id" : 101, "Value" : 3, "details" : [ { "Age" : 29, "NumberOfDetails1" : 3 }, { "Age" : 31, "NumberOfDetails1" : 1 } ] }주요 연산자 정리
- $addFields: 문서에 새 필드를 추가하는 애그리게이션 단계입니다.
- $map: 배열의 각 요소를 순회하며 지정한 표현식을 적용한 새 배열을 반환합니다.
- $$d: $map의 as 옵션으로 정의한 변수로, 현재 순회 중인 배열 요소를 참조합니다.
- $size: 배열에 포함된 요소의 개수를 반환합니다.