$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 및 PartitionByFields를 생략하는 경우 partitionBy 및 partitionByFields는 상호 배타적입니다. 예시를 참조하세요. | |
옵션 | 문서를 그룹화하기 위한 복합 키로 필드 배열을 지정합니다. PartitionBy 및 PartitionByFields를 생략하는 경우 partitionBy 및 partitionByFields는 상호 배타적입니다.
| |
메서드가 하나 이상의 output.<field>에 지정된 경우 필수입니다. 그렇지 않은 경우 선택 사항입니다. | 각 파티션 내에서 문서를 정렬할 필드를 지정합니다. | |
필수 사항 | 누락된 값을 채울 각 필드를 포함하는 객체를 지정합니다. 출력 객체에서 여러 필드를 지정할 수 있습니다. 객체 이름은 채울 필드의 이름입니다. 객체 값은 필드가 채워지는 방식을 지정합니다. | |
필수 사항 | 대상 필드에서 누락된 값을 채우는 방법을 나타내는 객체를 지정합니다. 객체 이름은 |
동작 및 제한 사항
partitionByFields
제한 사항
$fill
은 partitionByFields 배열에 필드 이름이 있는 경우 오류를 반환합니다.
문자열이 아닌 값으로 평가합니다.
$
로 시작합니다.
linear
행동
linear
fill 메서드는 시퀀스에서 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
값을 채우려면 다음과 같이 linear
채우기 메서드와 함께 $fill
을 사용하세요.
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" } } } } ] )
참고
0 값 처리
출력:
[ { _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 } ]