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

MongoDB에서 프로젝션 중 필드 값을 변환해 날짜의 일(Day of Month)을 생성하는 쿼리 방법

MongoDB에서 필드 값을 변환하여 날짜의 일(day)을 생성하려면 aggregate() 메서드를 사용하면 됩니다. 이 글에서는 배열 형태로 저장된 타임스탬프 값을 프로젝션 단계에서 날짜로 변환하고, 그중 '일' 값만 추출하는 방법을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성

먼저 문서가 포함된 컬렉션을 생성합니다. 아래 예제에서는 details 배열 안에 유닉스 타임스탬프(dat)와 이름(Name)이 함께 저장되어 있습니다.

> db.demo209.insertOne(
...   {
...      "_id" : "101",
...      "details" : [
...         {
...            "dat" : 1528929908,
...            "Name" : "Chris"
...         },
...         {
...            "dat" : 1529082069,
...            "Name":"Carol"
...         }
...      ],
...      "Age" : 25,
...      "CountryName" : "US"
...   }
...);
{ "acknowledged" : true, "insertedId" : "101" }

2. 저장된 문서 확인하기

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

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

위 명령은 다음과 같은 결과를 출력합니다.

{
    "_id" : "101",
    "details" : [
       {
           "dat" : 1528929908,
           "Name" : "Chris"
       },
       {
           "dat" : 1529082069,
           "Name" : "Carol"
       }
    ],
    "Age" : 25,
    "CountryName" : "US"
}

3. aggregate()로 필드 값 변환 및 일(day) 추출하기

다음은 프로젝션($project) 단계에서 필드 값을 변환하고 날짜의 일을 생성하는 쿼리입니다. 핵심 동작 원리는 다음과 같습니다.

  • $unwind: details 배열을 개별 문서로 분해하여 각 요소를 독립적으로 처리할 수 있게 합니다.
  • $add와 $multiply: 유닉스 타임스탬프는 초 단위이므로 1000을 곱해 밀리초 단위로 변환한 뒤, 기준 시점인 new Date(0)(1970년 1월 1일)에 더해 실제 Date 객체를 만듭니다.
  • $dayOfMonth: 변환된 날짜 값에서 '일'에 해당하는 숫자만 추출합니다.
> db.demo209.aggregate({
...   "$unwind": "$details"
...   }, {
...         "$project": {
...            "Age": 1,
...            "CountryName": 1,
...            "Name": "$details.Name",
...            "DayOfMonth": {
...               "$dayOfMonth": {
...                  "$add": [new Date(0), {
...                     "$multiply": ["$details.dat", 1000]
...                  }]
...               }
...            }
...      }
...})

4. 실행 결과

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다. 각 배열 요소가 별도의 문서로 분해되고, 타임스탬프가 해당하는 날짜의 일 값으로 변환된 것을 확인할 수 있습니다.

{ "_id" : "101", "Age" : 25, "CountryName" : "US", "Name" : "Chris", "DayOfMonth" : 13 }
{ "_id" : "101", "Age" : 25, "CountryName" : "US", "Name" : "Carol", "DayOfMonth" : 15 }

이처럼 MongoDB의 애그리게이션 파이프라인을 활용하면 초 단위 유닉스 타임스탬프를 손쉽게 날짜 데이터로 변환하고, 필요한 정보만 프로젝션하여 추출할 수 있습니다. 참고로 $dayOfMonth 외에도 $year, $month, $hour 등 다양한 날짜 연산자를 조합하면 연, 월, 시간 등 원하는 단위의 값도 함께 추출할 수 있습니다.