문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

$fill (aggregation)

이 페이지의 내용

  • 정의
  • 구문
  • 동작 및 제한 사항
  • partitionByFields 제한 사항
  • linear 행동
  • locf 행동
  • $fill과 애그리게이션 연산자 비교
  • 예제
  • 상수 값으로 누락된 필드 값 채우기
  • 선형 보간으로 누락된 필드 값 채우기
  • 마지막으로 관찰된 값을 기준으로 누락된 필드 값 채우기
  • 고유 파티션의 데이터 채우기
  • 필드가 다음을 사용하여 채워졌는지 표시: $fill
$fill

버전 5.3에 추가.

문서 내에서 null 필드 값과 누락된 필드 값을 채웁니다.

$fill 를 사용하여 누락된 데이터 포인트를 채울 수 있습니다.

  • 주변 값을 기반으로 한 시퀀스에서

  • 고정 값을 사용

$fill 단계의 구문은 다음과 같습니다.

{
$fill: {
partitionBy: <expression>,
partitionByFields: [ <field 1>, <field 2>, ... , <field n> ],
sortBy: {
<sort field 1>: <sort order>,
<sort field 2>: <sort order>,
...,
<sort field n>: <sort order>
},
output: {
<field 1>: { value: <expression> },
<field 2>: { method: <string> },
...
}
}
}

$fill 단계에서는 이러한 필드가 있는 문서를 사용합니다.

필드
필요성
설명
partitionBy
옵션

문서를 그룹화하는 표현식 을 지정합니다. $fill 단계에서는 문서 그룹을 파티션 이라고 합니다.

partitionBypartitionByFields 를 생략하면 $fill 는 전체 컬렉션에 대해 하나의 파티션을 사용합니다.

partitionBypartitionByFields 는 상호 배타적입니다.

예제를 참조하세요.

옵션

문서를 그룹화하기 위한 복합 키로 필드 배열을 지정합니다. $fill 단계에서는 각 문서 그룹을 파티션 이라고 합니다.

partitionBypartitionByFields 를 생략하면 $fill 는 전체 컬렉션에 대해 하나의 파티션을 사용합니다.

partitionBypartitionByFields 는 상호 배타적입니다.

partitionByFields 제한 사항을 참조하세요.

메서드 가 하나 이상의 output.<field>에 지정된 경우 필수입니다.

그렇지 않은 경우 선택 사항입니다.

각 파티션 내에서 문서를 정렬할 필드를 지정합니다. $sort 단계와 동일한 구문을 사용합니다.

필수 사항

누락된 값을 채울 각 필드가 포함된 객체를 지정합니다. 출력 객체에 여러 필드를 지정할 수 있습니다.

객체 이름은 채울 필드의 이름입니다. 객체 값은 필드가 채워지는 방식을 지정합니다.

필수 사항

대상 필드에서 누락된 값을 채우는 방법을 나타내는 객체를 지정합니다.

객체 이름은 value 또는 method여야 합니다. 이름이 다음과 같은 경우:

  • value인 경우, 값은 대상 필드를 채우는 데 사용되는 값을 나타내는 표현식이어야 합니다.

  • method인 경우, 값은 linear 또는 locf여야 합니다. 다음을 지정하는 경우:

    • linear 채우기 메서드에서 선형 보간 을 사용하여 값이null 채워집니다. 시퀀스의 이 아닌 주변 값을 기반으로 합니다.

    • locf 채우기 메서드에서 값은 파티션에 있는 필드의 'null'이 아닌 마지막 값을 기준으로 채워집니다. locf는 이월된 마지막 관찰을 나타냅니다.

      다음도 참조하세요.

$fillpartitionByFields 배열에 필드 이름이 있는 경우 오류를 반환합니다.

  • 문자열이 아닌 값으로 평가합니다.

  • $로 시작합니다.

채우기 linear null 메서드는 선형 보간null 을 사용하여 및 누락된 필드를 채웁니다. 시퀀스의 이 아닌 주변 값을 기반으로 합니다.

  • 필드가 null 이거나 누락된 각 문서에 대해 linearFillsortBy 순서에 따라null 이 아닌 주변 값 사이의 누락된 값 범위에 비례하여 해당 필드를 채웁니다. 누락된 필드의 값을 확인하기 위해 linearFill 는 다음을 사용합니다.

    • null이 아닌 주변 값의 차이입니다.

    • 주변 값 사이를 채울 null 필드의 수입니다.

  • linear 메서드는 sortBy 순서에 따라null 이 아닌 값이 앞뒤에 있는 경우 여러 개의 연속 null 값을 채울 수 있습니다.

    예제

    컬렉션에 다음과 같은 문서가 포함된 경우:

    { index: 0, value: 0 },
    { index: 1, value: null },
    { index: 2, value: null },
    { index: 3, value: null },
    { index: 4, value: 10 }

    linear 채우기 메서드를 사용하여 null 값을 채우면 문서가 다음과 같이 됩니다.

    { index: 0, value: 0 },
    { index: 1, value: 2.5 },
    { index: 2, value: 5 },
    { index: 3, value: 7.5 },
    { index: 4, value: 10 }
  • null 앞뒤에 null이 아닌 값이 오지 않는 값은 null로 유지됩니다.

  • linear 채우기 메서드를 사용하려면 sortBy 필드도 사용하여 데이터를 정렬해야 합니다.

    • linear 채우기 메서드를 사용할 때 $fill 는 단일 파티션의 sortBy 필드에 반복되는 값이 있는 경우 오류를 반환합니다.

linear 채우기 메서드를 사용하는 전체 예제 는 선형 보간으로 누락된 필드 값 채우기를 참조하세요.

locf 는 이월된 마지막 관찰을 나타냅니다.

  • 채워지는 필드에 null 값과 null이 아닌 값이 모두 포함되어 있는 경우 locfnull 및 누락된 값을 sortBy 순서에 따라 필드의 마지막으로 알려진 null이 아닌 값으로 설정합니다.

    • 파티션에서 필드에 null 또는 누락된 값만 포함되어 있는 경우 locf 는 해당 파티션 의 필드 값을 null (으)로 설정합니다.

    • null 그리고 누락된 값이 정렬 순서에서 null이 아닌 값 앞에 나타나는 경우 null 상태로 유지됩니다.

  • locf 채우기 메서드를 사용하려면 sortBy 필드도 사용하여 데이터를 정렬해야 합니다.

locf 채우기 메서드를 사용하는 전체 예제 는 마지막 관찰 값을 기준으로 누락된 필드 값 채우기를 참조하세요.

문서 내에서 null 및 누락된 필드 값을 채우려면 다음을 사용할 수 있습니다.

  • $fill 단계.

    $fill 단계를 사용하는 경우 출력에 지정하는 필드는 소스 데이터로 사용되는 필드와 동일한 필드입니다.

  • $linearFill$locf 애그리게이션 연산자입니다.

    $linearFill 또는 $locf인 경우 소스 데이터로 사용된 필드와 다른 필드에 대한 값을 설정할 수 있습니다.

이 섹션의 예에서는 $fill 을 사용하여 누락된 값을 채우는 방법을 보여 줍니다.

신발 가게는 일별 판매를 요약하는 문서가 포함된 dailySales 컬렉션을 유지 관리합니다. 신발 가게에서는 다음과 같은 종류의 신발을 판매합니다.

  • boots

  • sandals

  • sneakers

다음 dailySales 컬렉션을 만듭니다:

db.dailySales.insertMany( [
{
"date": ISODate("2022-02-02"),
"bootsSold": 10,
"sandalsSold": 20,
"sneakersSold": 12
},
{
"date": ISODate("2022-02-03"),
"bootsSold": 7,
"sneakersSold": 18
},
{
"date": ISODate("2022-02-04"),
"sneakersSold": 5
}
] )

dailySales 컬렉션의 모든 문서에 각 신발 유형이 포함되어 있는 것은 아닙니다. 신발 유형이 누락된 경우, 해당 날짜에 해당 유형의 신발이 판매되지 않았음을 의미합니다.

다음 예제에서는 $fill 를 사용하여 각 날짜의 판매량에서 누락된 신발 유형에 대해 판매 수량을 0 으)로 설정합니다.

db.dailySales.aggregate( [
{
$fill:
{
output:
{
"bootsSold": { value: 0 },
"sandalsSold": { value: 0 },
"sneakersSold": { value: 0 }
}
}
}
] )

이전 파이프라인의 경우:

  • $fill 은 누락된 필드의 값을 채웁니다.

  • 출력 은 다음을 지정합니다.

    • 입력할 필드의 이름

    • 입력된 필드에 설정할 값. 이 예제에서 출력은 상수 값 0을 지정합니다.

출력 예시:

[
{
_id: ObjectId("6202df9f394d47411658b51e"),
date: ISODate("2022-02-02T00:00:00.000Z"),
bootsSold: 10,
sandalsSold: 20,
sneakersSold: 12
},
{
_id: ObjectId("6202df9f394d47411658b51f"),
date: ISODate("2022-02-03T00:00:00.000Z"),
bootsSold: 7,
sneakersSold: 18,
sandalsSold: 0
},
{
_id: ObjectId("6202df9f394d47411658b520"),
date: ISODate("2022-02-04T00:00:00.000Z"),
sneakersSold: 5,
bootsSold: 0,
sandalsSold: 0
}
]

시간 간격으로 단일 회사의 주가를 추적하는 stock 컬렉션을 생성합니다.

db.stock.insertMany( [
{
time: ISODate("2021-03-08T09:00:00.000Z"),
price: 500
},
{
time: ISODate("2021-03-08T10:00:00.000Z"),
},
{
time: ISODate("2021-03-08T11:00:00.000Z"),
price: 515
},
{
time: ISODate("2021-03-08T12:00:00.000Z")
},
{
time: ISODate("2021-03-08T13:00:00.000Z")
},
{
time: ISODate("2021-03-08T14:00:00.000Z"),
price: 485
}
] )

컬렉션의 일부 문서에 대한 price 필드가 누락되었습니다.

선형 보간 을 사용하여 누락된 price 값을 $fill 채우려면 linear 채우기 메서드와 함께 를 사용합니다.

db.stock.aggregate( [
{
$fill:
{
sortBy: { time: 1 },
output:
{
"price": { method: "linear" }
}
}
}
] )

이전 파이프라인의 경우:

  • $fill 은 누락된 필드의 값을 채웁니다.

  • sortBy: { time: 1 }time 필드를 기준으로 문서를 가장 오래된 것부터 최근 것까지 오름차순으로 정렬합니다.

  • 출력 은 다음을 지정합니다.

    • price 를 누락된 값을 채울 필드로 지정합니다.

    • { method: "linear" } 를 채우기 linear 메서드로 지정합니다. 채우기 메서드는 price 선형 보간 을 사용하여 누락된 값을 채웁니다.price 시퀀스의 주변 값을 기반으로 합니다.

출력 예시:

[
{
_id: ObjectId("620ad41c394d47411658b5e9"),
time: ISODate("2021-03-08T09:00:00.000Z"),
price: 500
},
{
_id: ObjectId("620ad41c394d47411658b5ea"),
time: ISODate("2021-03-08T10:00:00.000Z"),
price: 507.5
},
{
_id: ObjectId("620ad41c394d47411658b5eb"),
time: ISODate("2021-03-08T11:00:00.000Z"),
price: 515
},
{
_id: ObjectId("620ad41c394d47411658b5ec"),
time: ISODate("2021-03-08T12:00:00.000Z"),
price: 505
},
{
_id: ObjectId("620ad41c394d47411658b5ed"),
time: ISODate("2021-03-08T13:00:00.000Z"),
price: 495
},
{
_id: ObjectId("620ad41c394d47411658b5ee"),
time: ISODate("2021-03-08T14:00:00.000Z"),
price: 485
}
]

시간 경과에 따른 단일 레스토랑의 리뷰 점수를 포함하는 restaurantReviews 컬렉션을 생성합니다.

db.restaurantReviews.insertMany( [
{
date: ISODate("2021-03-08"),
score: 90
},
{
date: ISODate("2021-03-09"),
score: 92
},
{
date: ISODate("2021-03-10")
},
{
date: ISODate("2021-03-11")
},
{
date: ISODate("2021-03-12"),
score: 85
},
{
date: ISODate("2021-03-13")
}
] )

컬렉션의 일부 문서에 대한 score 필드가 누락되었습니다.

누락된 score 필드를 채우고 데이터에 공백이 없는지 확인하려면 $fill 를 사용합니다. 다음 예제에서 $filllocf 채우기 메서드를 사용하여 누락된 score 값을 시퀀스의 이전 score 로 채웁니다.

db.restaurantReviews.aggregate( [
{
$fill:
{
sortBy: { date: 1 },
output:
{
"score": { method: "locf" }
}
}
}
] )

이전 파이프라인의 경우:

  • $fill 이 누락된 score 값을 채웁니다.

  • sortBy: { date: 1 }date 필드를 기준으로 문서를 가장 오래된 것부터 최근 것까지 오름차순으로 정렬합니다.

  • 출력 은 다음을 지정합니다.

    • score 를 누락된 값을 채울 필드로 지정합니다.

    • { method: "locf" } 를 채우기 메서드로 지정합니다. locf 채우기 메서드는 누락된 score 값을 시퀀스에서 마지막으로 관찰된 score로 채웁니다.

출력 예시:

[
{
_id: ObjectId("62040bc9394d47411658b553"),
date: ISODate("2021-03-08T00:00:00.000Z"),
score: 90
},
{
_id: ObjectId("62040bc9394d47411658b554"),
date: ISODate("2021-03-09T00:00:00.000Z"),
score: 92
},
{
_id: ObjectId("62040bc9394d47411658b555"),
date: ISODate("2021-03-10T00:00:00.000Z"),
score: 92
},
{
_id: ObjectId("62040bc9394d47411658b556"),
date: ISODate("2021-03-11T00:00:00.000Z"),
score: 92
},
{
_id: ObjectId("62040bc9394d47411658b557"),
date: ISODate("2021-03-12T00:00:00.000Z"),
score: 85
},
{
_id: ObjectId("62040bc9394d47411658b558"),
date: ISODate("2021-03-13T00:00:00.000Z"),
score: 85
}
]

레스토랑 리뷰가 있는 이전 예제 를 생각해 보겠습니다. 하지만 이제 단일 레스토랑을 추적하는 대신 컬렉션에 여러 레스토랑에 대한 리뷰가 포함됩니다.

restaurantReviewsMultiple이라는 이름의 컬렉션을 생성하고 다음 문서들로 컬렉션을 채웁니다.

db.restaurantReviewsMultiple.insertMany( [
{
date: ISODate("2021-03-08"),
restaurant: "Joe's Pizza",
score: 90
},
{
date: ISODate("2021-03-08"),
restaurant: "Sally's Deli",
score: 75
},
{
date: ISODate("2021-03-09"),
restaurant: "Joe's Pizza",
score: 92
},
{
date: ISODate("2021-03-09"),
restaurant: "Sally's Deli"
},
{
date: ISODate("2021-03-10"),
restaurant: "Joe's Pizza"
},
{
date: ISODate("2021-03-10"),
restaurant: "Sally's Deli",
score: 68
},
{
date: ISODate("2021-03-11"),
restaurant: "Joe's Pizza",
score: 93
},
{
date: ISODate("2021-03-11"),
restaurant: "Sally's Deli"
}
] )

컬렉션의 일부 문서에 대한 score 필드가 누락되었습니다.

누락된 score 필드를 채우고 데이터에 공백이 없는지 확인하려면 $fill 를 사용합니다. 다음 예제에서 $filllocf 채우기 메서드를 사용하여 누락된 score 값을 시퀀스의 이전 score 로 채웁니다.

db.restaurantReviewsMultiple.aggregate( [
{
$fill:
{
sortBy: { date: 1 },
partitionBy: { "restaurant": "$restaurant" },
output:
{
"score": { method: "locf" }
}
}
}
] )

이전 파이프라인의 경우:

  • $fill 이 누락된 score 값을 채웁니다.

  • sortBy: { date: 1 }date 필드를 기준으로 문서를 가장 오래된 것부터 최근 것까지 오름차순으로 정렬합니다.

  • partitionBy: { "restaurant": "$restaurant" } 데이터를 restaurant만큼 분할합니다. Joe's PizzaSally's Deli라는 두 개의 레스토랑이 있습니다.

  • 출력 은 다음을 지정합니다.

    • score 를 누락된 값을 채울 필드로 지정합니다.

    • { method: "locf" } 를 채우기 메서드로 지정합니다. locf 채우기 메서드는 누락된 score 값을 시퀀스에서 마지막으로 관찰된 score로 채웁니다.

출력 예시:

[
{
_id: ObjectId("620559f4394d47411658b58f"),
date: ISODate("2021-03-08T00:00:00.000Z"),
restaurant: "Joe's Pizza",
score: 90
},
{
_id: ObjectId("620559f4394d47411658b591"),
date: ISODate("2021-03-09T00:00:00.000Z"),
restaurant: "Joe's Pizza",
score: 92
},
{
_id: ObjectId("620559f4394d47411658b593"),
date: ISODate("2021-03-10T00:00:00.000Z"),
restaurant: "Joe's Pizza",
score: 92
},
{
_id: ObjectId("620559f4394d47411658b595"),
date: ISODate("2021-03-11T00:00:00.000Z"),
restaurant: "Joe's Pizza",
score: 93
},
{
_id: ObjectId("620559f4394d47411658b590"),
date: ISODate("2021-03-08T00:00:00.000Z"),
restaurant: "Sally's Deli",
score: 75
},
{
_id: ObjectId("620559f4394d47411658b592"),
date: ISODate("2021-03-09T00:00:00.000Z"),
restaurant: "Sally's Deli",
score: 75
},
{
_id: ObjectId("620559f4394d47411658b594"),
date: ISODate("2021-03-10T00:00:00.000Z"),
restaurant: "Sally's Deli",
score: 68
},
{
_id: ObjectId("620559f4394d47411658b596"),
date: ISODate("2021-03-11T00:00:00.000Z"),
restaurant: "Sally's Deli",
score: 68
}
]

누락된 값을 채울 때 값이 $fill 연산자로 채워졌는지 또는 값이 원래 문서에 있었는지 여부가 출력에 표시되지 않습니다. 채워진 값과 기존 값을 구분하려면 $fill 앞에 $set 단계를 사용하고 값이 존재하는지 여부에 따라 새 필드를 설정하면 됩니다.

예를 들어 시간 경과에 따른 레스토랑의 리뷰 점수를 포함하는 restaurantReviews 컬렉션을 만듭니다.

db.restaurantReviews.insertMany( [
{
date: ISODate("2021-03-08"),
score: 90
},
{
date: ISODate("2021-03-09"),
score: 92
},
{
date: ISODate("2021-03-10")
},
{
date: ISODate("2021-03-11")
},
{
date: ISODate("2021-03-12"),
score: 85
},
{
date: ISODate("2021-03-13")
}
] )

컬렉션의 일부 문서에 대한 score 필드가 누락되었습니다. $fill 연산자를 사용하여 누락된 score 값을 채울 수 있습니다.

파이프라인을 생성하여 다음 조치를 수행합니다.

  • $fill 연산자가 값을 채우기 전에 문서의 score 필드가 존재하는지 여부를 나타내는 새 필드를 각 문서에 추가합니다($set 사용). 이 새 필드의 이름은 valueExisted입니다.

  • 누락된 score 값을 시퀀스에서 마지막으로 관찰된 score로 채웁니다. 채우기 메서드 locf는 '이월된 마지막 관찰'을 의미합니다.

파이프라인은 다음과 같습니다.

db.restaurantReviews.aggregate( [
{
$set: {
"valueExisted": {
"$ifNull": [
{ "$toBool": { "$toString": "$score" } },
false
]
}
}
},
{
$fill: {
sortBy: { date: 1 },
output:
{
"score": { method: "locf" }
}
}
}
] )

참고

0 값 처리

$ifNull 표현식에서 score 값은 문자열로 변환된 다음 부울로 변환됩니다. $toBool 표현식은 항상 문자열을 true로 변환합니다. score 값이 문자열로 변환되지 않은 경우, 0score 값은 valueExistedfalse로 설정되도록 합니다.

출력:

[
{
_id: ObjectId("63595116b1fac2ee2e957f15"),
date: ISODate("2021-03-08T00:00:00.000Z"),
score: 90,
valueExisted: true
},
{
_id: ObjectId("63595116b1fac2ee2e957f16"),
date: ISODate("2021-03-09T00:00:00.000Z"),
score: 92,
valueExisted: true
},
{
_id: ObjectId("63595116b1fac2ee2e957f17"),
date: ISODate("2021-03-10T00:00:00.000Z"),
valueExisted: false,
score: 92
},
{
_id: ObjectId("63595116b1fac2ee2e957f18"),
date: ISODate("2021-03-11T00:00:00.000Z"),
valueExisted: false,
score: 92
},
{
_id: ObjectId("63595116b1fac2ee2e957f19"),
date: ISODate("2021-03-12T00:00:00.000Z"),
score: 85,
valueExisted: true
},
{
_id: ObjectId("63595116b1fac2ee2e957f1a"),
date: ISODate("2021-03-13T00:00:00.000Z"),
valueExisted: false,
score: 85
}
]
← $facet (aggregation)