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

MongoDB $group에서 계산된 표현식을 $push로 배열에 추가하는 방법

MongoDB에서 $group 단계 내부에 계산된 표현식을 배열로 추가하려면 aggregate() 메서드를 사용하면 됩니다. 이 글에서는 샘플 컬렉션을 생성한 뒤, $push 연산자와 $cond 조건식을 함께 활용해 그룹화 과정에서 동적으로 계산된 값을 배열에 담는 방법을 단계별로 살펴보겠습니다.

1. 샘플 데이터 생성

먼저 다음과 같이 문서들이 담긴 컬렉션을 생성합니다.

> db.demo24.insertOne({"Id":100,"Status":true});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e14c58722d07d3b95082e72")
}
> db.demo24.insertOne({"Id":100,"Status":true});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e14c58a22d07d3b95082e73")
}
> db.demo24.insertOne({"Id":100,"Status":false});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e14c58f22d07d3b95082e74")
}
> db.demo24.insertOne({"Id":100,"Status":true});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e14c59122d07d3b95082e75")
}
> db.demo24.insertOne({"Id":100,"Status":false});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e14c59222d07d3b95082e76")
}

2. 저장된 문서 확인하기

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

> db.demo24.find();

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

{ "_id" : ObjectId("5e14c58722d07d3b95082e72"), "Id" : 100, "Status" : true }
{ "_id" : ObjectId("5e14c58a22d07d3b95082e73"), "Id" : 100, "Status" : true }
{ "_id" : ObjectId("5e14c58f22d07d3b95082e74"), "Id" : 100, "Status" : false }
{ "_id" : ObjectId("5e14c59122d07d3b95082e75"), "Id" : 100, "Status" : true }
{ "_id" : ObjectId("5e14c59222d07d3b95082e76"), "Id" : 100, "Status" : false }

3. $group에서 계산된 표현식 push하기

핵심은 $push 안에 $cond 연산자를 중첩하는 것입니다. $cond는 삼항 조건 연산자로, 지정한 조건이 참인지 거짓인지에 따라 서로 다른 값을 반환합니다. 아래 쿼리는 Status 필드가 true이면 'Active', false이면 'InActive'를 반환하도록 설정되어 있습니다.

> db.demo24.aggregate({$group: {_id:'$Id', AllValues: {$push: {$cond: [{$eq: ['$Status', true]},'Active','InActive']}}}})

쿼리 구조 살펴보기

  • _id: '$Id' — Id 필드 값을 기준으로 문서들을 그룹화합니다.
  • AllValues — 각 그룹에 속한 문서마다 계산된 결과값을 모아 하나의 배열로 만듭니다.
  • $eq: ['$Status', true] — Status 필드가 true와 같은지 비교하는 조건식입니다.

위 집계 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : 100, "AllValues" : [ "Active", "Active", "InActive", "Active", "InActive" ] }

출력 결과를 보면 Id가 100인 문서들이 하나의 그룹으로 묶였고, 각 문서의 Status 값이 'Active' 또는 'InActive' 문자열로 변환되어 AllValues 배열에 순서대로 추가된 것을 확인할 수 있습니다. 이처럼 $group$push, $cond를 조합하면 단순히 원본 필드를 모으는 것을 넘어, 그룹화 과정에서 원하는 형태로 가공된 값을 손쉽게 수집할 수 있습니다.