$밀집화

$densify 집계 파이프라인의 단계는 값 시퀀스 내에서 누락된 데이터 요소를 채우는 데 사용됩니다. 지정된 필드, 범위 및 단계에 따라 누락된 값을 생성하여 보다 완전한 데이터 세트를 만드는 데 도움이 됩니다. 정확한 분석을 위해 데이터 요소의 간격을 채워야 하는 시계열 데이터 분석과 같은 시나리오에서 유용합니다.

문법

{
  $densify: {
    field: <field>,
    range: {
      step: <number>,
      unit: <string>, // Optional, e.g., "hour", "day", "month", etc.
      bounds: [<lowerBound>, <upperBound>] // Optional
    },
    partitionByFields: [<field1>, <field2>, ...] // Optional
  }
}

매개 변수

매개 변수 Description
field 비정규화가 수행되는 필드입니다.
range.step 누락된 값을 생성하기 위한 단계 크기입니다.
range.unit (선택 사항) 시간 단위(예: "hour", "day")와 같은 단계 크기의 단위입니다.
range.bounds (선택 사항) 비정규화의 범위(하한 및 상한)를 지정합니다.
partitionByFields (선택 사항) 비정규화를 위해 데이터를 그룹화하는 데 사용되는 필드입니다.

예시

스토어 컬렉션에서 이 샘플 문서를 고려합니다.

{
    "_id": "0fcc0bf0-ed18-4ab8-b558-9848e18058f4",
    "name": "First Up Consultants | Beverage Shop - Satterfieldmouth",
    "location": {
        "lat": -89.2384,
        "lon": -46.4012
    },
    "staff": {
        "totalStaff": {
            "fullTime": 8,
            "partTime": 20
        }
    },
    "sales": {
        "totalSales": 75670,
        "salesByCategory": [
            {
                "categoryName": "Wine Accessories",
                "totalSales": 34440
            },
            {
                "categoryName": "Bitters",
                "totalSales": 39496
            },
            {
                "categoryName": "Rum",
                "totalSales": 1734
            }
        ]
    },
    "promotionEvents": [
        {
            "eventName": "Unbeatable Bargain Bash",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 6,
                    "Day": 23
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 7,
                    "Day": 2
                }
            },
            "discounts": [
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 7
                },
                {
                    "categoryName": "Bitters",
                    "discountPercentage": 15
                },
                {
                    "categoryName": "Brandy",
                    "discountPercentage": 8
                },
                {
                    "categoryName": "Sports Drinks",
                    "discountPercentage": 22
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 19
                }
            ]
        },
        {
            "eventName": "Steal of a Deal Days",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 21
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 29
                }
            },
            "discounts": [
                {
                    "categoryName": "Organic Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "White Wine",
                    "discountPercentage": 20
                },
                {
                    "categoryName": "Sparkling Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 17
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 23
                }
            ]
        }
    ]
}

예제 1: 시계열 데이터 세트의 비정규화

이 쿼리는 날짜 필드에 누락된 날짜로 채워 줍니다.

db.aggregate([
    {
      $documents: [
        { date: new ISODate("2024-01-01"), value: 10 },
        { date: new ISODate("2024-01-03"), value: 15 }
      ]
    },
    {
      $densify: {
        field: "date",
        range: {
          step: 1,
          unit: "day",
          bounds: "full"
        }
      }
    }
  ]);

이 쿼리는 다음 결과를 반환합니다.

[
    {
        "date": "ISODate('2024-01-01T00:00:00.000Z')",
        "value": 10
    },
    {
        "date": "ISODate('2024-01-02T00:00:00.000Z')"
    },
    {
        "date": "ISODate('2024-01-03T00:00:00.000Z')",
        "value": 15
    }
]

예제 2: 숫자 데이터 비정규화

이 쿼리는 필드에 누락된 숫자 값을 sales.fullSales 채웁니다.

db.aggregate([
    {
      $documents: [
        { level: 1, score: 10 },
        { level: 3, score: 30 }
      ]
    },
    {
      $densify: {
        field: "level",
        range: {
          step: 1,
          bounds: [1, 5] 
        }
      }
    }
  ]);

이 쿼리는 다음 결과를 반환합니다.

[
    {
        "level": 1,
        "score": 10
    },
    {
        "level": 2
    },
    {
        "level": 3,
        "score": 30
    },
    {
        "level": 4
    }
]

제한점

다음 표에는 집계 파이프라인의 $densify 단계와 관련된 주요 제한 사항 및 동작이 요약되어 있습니다.

카테고리 조건/동작
필드 제한 - 문서에 날짜 값이 있고 unit지정되지 않은 경우 오류가 발생합니다.
- 문서에 숫자 값이 있고 unit 지정된 경우 오류가 발생 합니다.
- 필드 이름이 .로 $시작됩니다. 이름을 바꾸는 데 사용합니다 $project .
partitionByFields - 모든 필드는 문자열 이 아닌 값으로 평가됩니다.
- 필드 이름이 .로 $시작됩니다.
range.bounds - 하한 은 기존 문서에 관계없이 시작 값을 정의합니다.
- 하한은 포함됩니다.
- 상한은 배타적입니다.
- $densify 는 범위를 벗어난 문서를 필터링하지 않습니다 .