문서 홈 → 애플리케이션 개발 → MongoDB 매뉴얼
$fill (aggregation)
이 페이지의 내용
정의
$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 및 partitionByFields 를 생략하면 partitionBy 및 partitionByFields 는 상호 배타적입니다. | |
옵션 | 문서를 그룹화하기 위한 복합 키로 필드 배열을 지정합니다. partitionBy 및 partitionByFields 를 생략하면 partitionBy 및 partitionByFields 는 상호 배타적입니다. | |
메서드 가 하나 이상의 output.<field>에 지정된 경우 필수입니다. 그렇지 않은 경우 선택 사항입니다. | 각 파티션 내에서 문서를 정렬할 필드를 지정합니다. | |
필수 사항 | 누락된 값을 채울 각 필드가 포함된 객체를 지정합니다. 출력 객체에 여러 필드를 지정할 수 있습니다. 객체 이름은 채울 필드의 이름입니다. 객체 값은 필드가 채워지는 방식을 지정합니다. | |
필수 사항 | 대상 필드에서 누락된 값을 채우는 방법을 나타내는 객체를 지정합니다. 객체 이름은 |
동작 및 제한 사항
partitionByFields
제한 사항
$fill
은 partitionByFields 배열에 필드 이름이 있는 경우 오류를 반환합니다.
문자열이 아닌 값으로 평가합니다.
$
로 시작합니다.
linear
행동
채우기 linear
null
메서드는 선형 보간null
을 사용하여 및 누락된 필드를 채웁니다. 시퀀스의 이 아닌 주변 값을 기반으로 합니다.
필드가
null
이거나 누락된 각 문서에 대해linearFill
는 sortBy 순서에 따라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
채우기 메서드를 사용하는 전체 예제 는 선형 보간으로 누락된 필드 값 채우기를 참조하세요.
locf
행동
locf
는 이월된 마지막 관찰을 나타냅니다.
채워지는 필드에
null
값과 null이 아닌 값이 모두 포함되어 있는 경우locf
는null
및 누락된 값을 sortBy 순서에 따라 필드의 마지막으로 알려진 null이 아닌 값으로 설정합니다.파티션에서 필드에
null
또는 누락된 값만 포함되어 있는 경우locf
는 해당 파티션 의 필드 값을null
(으)로 설정합니다.null
그리고 누락된 값이 정렬 순서에서 null이 아닌 값 앞에 나타나는 경우null
상태로 유지됩니다.
locf
채우기 메서드를 사용하려면 sortBy 필드도 사용하여 데이터를 정렬해야 합니다.
locf
채우기 메서드를 사용하는 전체 예제 는 마지막 관찰 값을 기준으로 누락된 필드 값 채우기를 참조하세요.
$fill
와 애그리게이션 연산자 비교
문서 내에서 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 } } } } ] )
이전 파이프라인의 경우:
출력 예시:
[ { _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
를 사용합니다. 다음 예제에서 $fill
는 locf
채우기 메서드를 사용하여 누락된 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
를 사용합니다. 다음 예제에서 $fill
는 locf
채우기 메서드를 사용하여 누락된 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 Pizza
와Sally'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
연산자로 채워졌는지 또는 값이 원래 문서에 있었는지 여부가 출력에 표시되지 않습니다. 채워진 값과 기존 값을 구분하려면 $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" } } } } ] )
참고
출력:
[ { _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 } ]