정의
버전 5.0의 신규 항목입니다.
collection에 있는 특정 범위의 문서(창이라고 함) 에 대해 작업을 수행하고 선택한 창 창 연산자를 기반으로 결과를 반환합니다.
예를 들어, $setWindowFields 단계를 사용해 다음을 출력할 수 있습니다.
컬렉션에 있는 두 문서 간의 판매량 차이입니다.
판매 순위.
누적 판매 총액입니다.
데이터를 외부 데이터베이스로 내보내지 않고도 복잡한 시계열 정보를 분석합니다.
구문
$setWindowFields 단계 구문:
{ $setWindowFields: { partitionBy: <expression>, sortBy: { <sort field 1>: <sort order>, <sort field 2>: <sort order>, ..., <sort field n>: <sort order> }, output: { <output field 1>: { <window operator>: <window operator parameters>, window: { documents: [ <lower boundary>, <upper boundary> ], range: [ <lower boundary>, <upper boundary> ], unit: <time unit> } }, <output field 2>: { ... }, ... <output field n>: { ... } } } }
$setWindowFields 단계는 다음 필드가 포함된 문서를 사용합니다.
필드 | 필요성 | 설명 |
|---|---|---|
옵션 | 문서를 그룹화하는 표현식을 지정합니다. | |
일부 연산자에 대해 필수(제한 사항 참조) | 파티션에서 문서를 정렬할 필드를 지정합니다. | |
필수 사항 |
필드에는 내장된 문서 필드와 배열 필드를 지정하기 위한 점이 포함될 수 있습니다.
| |
옵션 | ||
옵션 | 컬렉션에서 읽은 현재 문서의 위치를 기준으로 하한 및 상한 경계가 지정되는 창입니다. 창 경계는 하한 및 상한 문자열 또는 정수를 포함하는 두 요소 배열을 사용하여 지정됩니다. 다음을 사용하세요.
문서 창 예시를 참조하세요. | |
옵션 | ||
옵션 | 시간 범위 창 경계의 단위를 지정합니다. 다음 문자열 중 하나로 설정할 수 있습니다.
생략할 경우 기본값으로 설정된 숫자 범위 창 경계가 사용됩니다. 시간 범위 창 예시를 참조하세요. |
팁
행동
$setWindowFields 단계는 기존 문서에 새 필드를 추가합니다. 집계 연산에 하나 이상의 $setWindowFields 단계를 포함할 수 있습니다.
MongoDB 5.3 트랜잭션 및 "snapshot" 읽기 고려와 함께 $setWindowFields 단계를 사용할 수 있습니다.
$setWindowFields 단계는 반환된 문서의 순서를 보장하지 않습니다.
창 연산자
이러한 연산자는 $setWindowFields 단계와 함께 사용할 수 있습니다.
- 누산기 연산자:
$addToSet,$avg,$bottom,$bottomN,$concatArrays,$count,$covariancePop,$covarianceSamp,$derivative,$expMovingAvg,$firstN,$integral,$lastN,$max,$maxN,$median,$mergeObjects,$min,$minN,$percentile,$push,$setUnion,$stdDevSamp,$stdDevPop,$sum,$top,$topN.
- 간격 채우기 연산자 :
$linearFill,$locf.
순위 연산자:
$denseRank,$documentNumber및$rank.범위 연산자:
$minMaxScaler
설명 출력
버전 8.3에 추가 되었습니다.
$setWindowsFields 작업에서 explain 를 실행 출력에는 사용 중인 추적 메모리의 최대 바이트 수가 포함된 peakTrackedMemBytes 필드 포함됩니다. 자세한 내용은 explain.executionStats.peakTrackedMemBytes를 참조하세요.
제한 사항
다음은 $setWindowFields 단계에 대한 제한 사항입니다.
MongoDB 5.3 이전에는
$setWindowFields단계를 사용할 수 없습니다.트랜잭션 내.
"snapshot"읽기 고려 문제가 있습니다.
범위 창의 경우 지정된 범위의 숫자만 창에 포함됩니다. 누락된 값, 정의되지 않은 값,
null값은 제외됩니다.시간 범위 창:
창에는 날짜 및 시간 유형만 포함됩니다.
숫자 경계 값은 정수여야 합니다. 예를 들어 2시간은 경계로 사용할 수는 있지만 1.5시간은 사용할 수 없습니다.
예시
캘리포니아주(CA)와 워싱턴주(WA)의 케이크 판매량이 포함된 cakeSales collection을 생성합니다.
db.cakeSales.insertMany( [ { _id: 0, type: "chocolate", orderDate: new Date("2020-05-18T14:10:30Z"), state: "CA", price: 13, quantity: 120 }, { _id: 1, type: "chocolate", orderDate: new Date("2021-03-20T11:30:05Z"), state: "WA", price: 14, quantity: 140 }, { _id: 2, type: "vanilla", orderDate: new Date("2021-01-11T06:31:15Z"), state: "CA", price: 12, quantity: 145 }, { _id: 3, type: "vanilla", orderDate: new Date("2020-02-08T13:13:23Z"), state: "WA", price: 13, quantity: 104 }, { _id: 4, type: "strawberry", orderDate: new Date("2019-05-18T16:09:01Z"), state: "CA", price: 41, quantity: 162 }, { _id: 5, type: "strawberry", orderDate: new Date("2019-01-08T06:12:03Z"), state: "WA", price: 43, quantity: 134 } ] )
다음 예시에서는 cakeSales 컬렉션을 사용합니다.
문서 창 예시
문서 창을 사용하여 각 상태에 대한 누적 수량 가져오기
이 예시 $setWindowFields의 문서 창 사용하여 각 state에 대한 누적 케이크 판매량 quantity을 출력합니다. 예시 출력에서 cumulativeQuantityForState 필드 CA 및 WA에 대한 누적 quantity를 표시합니다.
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { orderDate: 1 }, output: { cumulativeQuantityForState: { $sum: "$quantity", window: { documents: [ "unbounded", "current" ] } } } } } ] )
[ { _id: 4, type: 'strawberry', orderDate: ISODate('2019-05-18T16:09:01.000Z'), state: 'CA', price: 41, quantity: 162, cumulativeQuantityForState: 162 }, { _id: 0, type: 'chocolate', orderDate: ISODate('2020-05-18T14:10:30.000Z'), state: 'CA', price: 13, quantity: 120, cumulativeQuantityForState: 282 }, { _id: 2, type: 'vanilla', orderDate: ISODate('2021-01-11T06:31:15.000Z'), state: 'CA', price: 12, quantity: 145, cumulativeQuantityForState: 427 }, { _id: 5, type: 'strawberry', orderDate: ISODate('2019-01-08T06:12:03.000Z'), state: 'WA', price: 43, quantity: 134, cumulativeQuantityForState: 134 }, { _id: 3, type: 'vanilla', orderDate: ISODate('2020-02-08T13:13:23.000Z'), state: 'WA', price: 13, quantity: 104, cumulativeQuantityForState: 238 }, { _id: 1, type: 'chocolate', orderDate: ISODate('2021-03-20T11:30:05.000Z'), state: 'WA', price: 14, quantity: 140, cumulativeQuantityForState: 378 } ]
예시:
partitionBy: "$state"는 컬렉션의 문서를state로 파티셔닝합니다.CA및WA에 대한 파티션이 있습니다.sortBy: { orderDate: 1 }각 파티션의 문서를orderDate별로 오름차순(1)으로 정렬 하므로 가장 이른orderDate가 먼저 표시됩니다.
문서 창을 사용해 연도별 누적 수량 가져오기
이 예시 에서는 $setWindowFields의 문서 창 사용하여 orderDate의 각 $year에 대한 누적 케이크 판매량 quantity을 출력합니다. 예시 출력에서 cumulativeQuantityForYear 필드 각 연도의 누적 quantity를 표시합니다.
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: { $year: "$orderDate" }, sortBy: { orderDate: 1 }, output: { cumulativeQuantityForYear: { $sum: "$quantity", window: { documents: [ "unbounded", "current" ] } } } } } ] )
[ { _id: 5, type: 'strawberry', orderDate: ISODate('2019-01-08T06:12:03.000Z'), state: 'WA', price: 43, quantity: 134, cumulativeQuantityForYear: 134 }, { _id: 4, type: 'strawberry', orderDate: ISODate('2019-05-18T16:09:01.000Z'), state: 'CA', price: 41, quantity: 162, cumulativeQuantityForYear: 296 }, { _id: 3, type: 'vanilla', orderDate: ISODate('2020-02-08T13:13:23.000Z'), state: 'WA', price: 13, quantity: 104, cumulativeQuantityForYear: 104 }, { _id: 0, type: 'chocolate', orderDate: ISODate('2020-05-18T14:10:30.000Z'), state: 'CA', price: 13, quantity: 120, cumulativeQuantityForYear: 224 }, { _id: 2, type: 'vanilla', orderDate: ISODate('2021-01-11T06:31:15.000Z'), state: 'CA', price: 12, quantity: 145, cumulativeQuantityForYear: 145 }, { _id: 1, type: 'chocolate', orderDate: ISODate('2021-03-20T11:30:05.000Z'), state: 'WA', price: 14, quantity: 140, cumulativeQuantityForYear: 285 } ]
예시:
partitionBy: { $year: "$orderDate" }orderDate에서$year를 기준으로 컬렉션 의 문서를 파티셔닝합니다.2019,2020및2021에 대한 파티션이 있습니다.sortBy: { orderDate: 1 }각 파티션의 문서를orderDate별로 오름차순(1)으로 정렬 하므로 가장 이른orderDate가 먼저 표시됩니다.
문서 창을 사용하여 연도별 이동 평균 수량 가져오기
이 예시 $setWindowFields의 문서 창 사용하여 케이크 판매 quantity에 대한 이동 평균을 출력합니다. 예시 출력에서 averageQuantity 필드 이동 평균 quantity를 표시합니다.
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: { $year: "$orderDate" }, sortBy: { orderDate: 1 }, output: { averageQuantity: { $avg: "$quantity", window: { documents: [ -1, 0 ] } } } } } ] )
[ { _id: 5, type: 'strawberry', orderDate: ISODate('2019-01-08T06:12:03.000Z'), state: 'WA', price: 43, quantity: 134, averageQuantity: 134 }, { _id: 4, type: 'strawberry', orderDate: ISODate('2019-05-18T16:09:01.000Z'), state: 'CA', price: 41, quantity: 162, averageQuantity: 148 }, { _id: 3, type: 'vanilla', orderDate: ISODate('2020-02-08T13:13:23.000Z'), state: 'WA', price: 13, quantity: 104, averageQuantity: 104 }, { _id: 0, type: 'chocolate', orderDate: ISODate('2020-05-18T14:10:30.000Z'), state: 'CA', price: 13, quantity: 120, averageQuantity: 112 }, { _id: 2, type: 'vanilla', orderDate: ISODate('2021-01-11T06:31:15.000Z'), state: 'CA', price: 12, quantity: 145, averageQuantity: 145 }, { _id: 1, type: 'chocolate', orderDate: ISODate('2021-03-20T11:30:05.000Z'), state: 'WA', price: 14, quantity: 140, averageQuantity: 142.5 } ]
예시:
partitionBy: "$orderDate"orderDate에서$year를 기준으로 컬렉션 의 문서를 파티셔닝합니다.2019,2020및2021에 대한 파티션이 있습니다.sortBy: { orderDate: 1 }각 파티션의 문서를orderDate별로 오름차순(1)으로 정렬 하므로 가장 이른orderDate가 먼저 표시됩니다.
문서 창을 사용하여 연도별 누적 및 최대 수량 가져오기
이 예시 $setWindowFields의 문서 창 사용하여 orderDate의 각 $year에 대한 누적 및 최대 케이크 판매 quantity 값을 출력합니다. 예시 출력에서 cumulativeQuantityForYear 필드 누적 quantity를 표시하고 maximumQuantityForYear 필드 최대 quantity를 표시합니다.
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: { $year: "$orderDate" }, sortBy: { orderDate: 1 }, output: { cumulativeQuantityForYear: { $sum: "$quantity", window: { documents: [ "unbounded", "current" ] } }, maximumQuantityForYear: { $max: "$quantity", window: { documents: [ "unbounded", "unbounded" ] } } } } } ] )
[ { _id: 5, type: 'strawberry', orderDate: ISODate('2019-01-08T06:12:03.000Z'), state: 'WA', price: 43, quantity: 134, cumulativeQuantityForYear: 134, maximumQuantityForYear: 162 }, { _id: 4, type: 'strawberry', orderDate: ISODate('2019-05-18T16:09:01.000Z'), state: 'CA', price: 41, quantity: 162, cumulativeQuantityForYear: 296, maximumQuantityForYear: 162 }, { _id: 3, type: 'vanilla', orderDate: ISODate('2020-02-08T13:13:23.000Z'), state: 'WA', price: 13, quantity: 104, cumulativeQuantityForYear: 104, maximumQuantityForYear: 120 }, { _id: 0, type: 'chocolate', orderDate: ISODate('2020-05-18T14:10:30.000Z'), state: 'CA', price: 13, quantity: 120, cumulativeQuantityForYear: 224, maximumQuantityForYear: 120 }, { _id: 2, type: 'vanilla', orderDate: ISODate('2021-01-11T06:31:15.000Z'), state: 'CA', price: 12, quantity: 145, cumulativeQuantityForYear: 145, maximumQuantityForYear: 145 }, { _id: 1, type: 'chocolate', orderDate: ISODate('2021-03-20T11:30:05.000Z'), state: 'WA', price: 14, quantity: 140, cumulativeQuantityForYear: 285, maximumQuantityForYear: 145 } ]
예시:
partitionBy: "$orderDate"orderDate에서$year를 기준으로 컬렉션 의 문서를 파티셔닝합니다.2019,2020및2021에 대한 파티션이 있습니다.sortBy: { orderDate: 1 }각 파티션의 문서를orderDate별로 오름차순(1)으로 정렬 하므로 가장 이른orderDate가 먼저 표시됩니다.output:cumulativeQuantityForYear필드를 각 연도의 누적quantity(으)로 설정합니다.연도별로
maximumQuantityForYear필드를 최대quantity로 설정합니다.
범위 윈도우 예시
이 예시 $setWindowFields의 범위 창 사용하여 현재 문서의 price 값에서 플러스 또는 마이너스 10 달러 이내의 주문에 대해 판매된 케이크의 quantity 값의 합계를 반환합니다. 예시 출력에서 quantityFromSimilarOrders 필드 창 에 있는 문서에 대한 quantity 값의 합계를 표시합니다.
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { price: 1 }, output: { quantityFromSimilarOrders: { $sum: "$quantity", window: { range: [ -10, 10 ] } } } } } ] )
[ { _id: 2, type: 'vanilla', orderDate: ISODate('2021-01-11T06:31:15.000Z'), state: 'CA', price: 12, quantity: 145, quantityFromSimilarOrders: 265 }, { _id: 0, type: 'chocolate', orderDate: ISODate('2020-05-18T14:10:30.000Z'), state: 'CA', price: 13, quantity: 120, quantityFromSimilarOrders: 265 }, { _id: 4, type: 'strawberry', orderDate: ISODate('2019-05-18T16:09:01.000Z'), state: 'CA', price: 41, quantity: 162, quantityFromSimilarOrders: 162 }, { _id: 3, type: 'vanilla', orderDate: ISODate('2020-02-08T13:13:23.000Z'), state: 'WA', price: 13, quantity: 104, quantityFromSimilarOrders: 244 }, { _id: 1, type: 'chocolate', orderDate: ISODate('2021-03-20T11:30:05.000Z'), state: 'WA', price: 14, quantity: 140, quantityFromSimilarOrders: 244 }, { _id: 5, type: 'strawberry', orderDate: ISODate('2019-01-08T06:12:03.000Z'), state: 'WA', price: 43, quantity: 134, quantityFromSimilarOrders: 134 } ]
예시:
시간 범위 창 예시
상한이 양수인 시간 범위 창 사용
다음 예시 양의 상한 시간 범위 단위가 $setWindowFields인 창 사용합니다. 파이프라인 지정된 시간 범위 와 일치하는 각 state에 대해 orderDate 값의 배열 출력합니다. 예시 출력에서 recentOrders 필드 CA 및 WA에 대한 orderDate 값의 배열 을 표시합니다.
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { orderDate: 1 }, output: { recentOrders: { $push: "$orderDate", window: { range: [ "unbounded", 10 ], unit: "month" } } } } } ] )
[ { _id: 4, type: 'strawberry', orderDate: ISODate('2019-05-18T16:09:01.000Z'), state: 'CA', price: 41, quantity: 162, recentOrders: [ ISODate('2019-05-18T16:09:01.000Z') ] }, { _id: 0, type: 'chocolate', orderDate: ISODate('2020-05-18T14:10:30.000Z'), state: 'CA', price: 13, quantity: 120, recentOrders: [ ISODate('2019-05-18T16:09:01.000Z'), ISODate('2020-05-18T14:10:30.000Z'), ISODate('2021-01-11T06:31:15.000Z') ] }, { _id: 2, type: 'vanilla', orderDate: ISODate('2021-01-11T06:31:15.000Z'), state: 'CA', price: 12, quantity: 145, recentOrders: [ ISODate('2019-05-18T16:09:01.000Z'), ISODate('2020-05-18T14:10:30.000Z'), ISODate('2021-01-11T06:31:15.000Z') ] }, { _id: 5, type: 'strawberry', orderDate: ISODate('2019-01-08T06:12:03.000Z'), state: 'WA', price: 43, quantity: 134, recentOrders: [ ISODate('2019-01-08T06:12:03.000Z') ] }, { _id: 3, type: 'vanilla', orderDate: ISODate('2020-02-08T13:13:23.000Z'), state: 'WA', price: 13, quantity: 104, recentOrders: [ ISODate('2019-01-08T06:12:03.000Z'), ISODate('2020-02-08T13:13:23.000Z') ] }, { _id: 1, type: 'chocolate', orderDate: ISODate('2021-03-20T11:30:05.000Z'), state: 'WA', price: 14, quantity: 140, recentOrders: [ ISODate('2019-01-08T06:12:03.000Z'), ISODate('2020-02-08T13:13:23.000Z'), ISODate('2021-03-20T11:30:05.000Z') ] } ]
예시:
partitionBy: "$state"는 컬렉션의 문서를state로 파티셔닝합니다.CA및WA에 대한 파티션이 있습니다.sortBy: { orderDate: 1 }각 파티션의 문서를orderDate별로 오름차순(1)으로 정렬 하므로 가장 이른orderDate가 먼저 표시됩니다.
$push는 파티션의 시작 부분과 현재 문서의orderDate값에10개월을 더한 범위 내에서orderDate값을 포함하는 문서 사이에 있는 문서들에 대한orderDate값 배열을 반환합니다.
음수 상한이 있는 시간 범위 창 사용
다음 예시 음수 상한 시간 범위 단위가 $setWindowFields인 창 사용합니다. 파이프라인 지정된 시간 범위 와 일치하는 각 state에 대해 orderDate 값의 배열 출력합니다. 예시 출력에서 recentOrders 필드 CA 및 WA에 대한 orderDate 값의 배열 을 표시합니다.
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { orderDate: 1 }, output: { recentOrders: { $push: "$orderDate", window: { range: [ "unbounded", -10 ], unit: "month" } } } } } ] )
[ { _id: 4, type: 'strawberry', orderDate: ISODate('2019-05-18T16:09:01.000Z'), state: 'CA', price: 41, quantity: 162, recentOrders: [] }, { _id: 0, type: 'chocolate', orderDate: ISODate('2020-05-18T14:10:30.000Z'), state: 'CA', price: 13, quantity: 120, recentOrders: [ ISODate('2019-05-18T16:09:01.000Z') ] }, { _id: 2, type: 'vanilla', orderDate: ISODate('2021-01-11T06:31:15.000Z'), state: 'CA', price: 12, quantity: 145, recentOrders: [ ISODate('2019-05-18T16:09:01.000Z') ] }, { _id: 5, type: 'strawberry', orderDate: ISODate('2019-01-08T06:12:03.000Z'), state: 'WA', price: 43, quantity: 134, recentOrders: [] }, { _id: 3, type: 'vanilla', orderDate: ISODate('2020-02-08T13:13:23.000Z'), state: 'WA', price: 13, quantity: 104, recentOrders: [ ISODate('2019-01-08T06:12:03.000Z') ] }, { _id: 1, type: 'chocolate', orderDate: ISODate('2021-03-20T11:30:05.000Z'), state: 'WA', price: 14, quantity: 140, recentOrders: [ ISODate('2019-01-08T06:12:03.000Z'), ISODate('2020-02-08T13:13:23.000Z') ] } ]
예시:
partitionBy: "$state"는 컬렉션의 문서를state로 파티셔닝합니다.CA및WA에 대한 파티션이 있습니다.sortBy: { orderDate: 1 }각 파티션의 문서를orderDate별로 오름차순(1)으로 정렬 하므로 가장 이른orderDate가 먼저 표시됩니다.
$push는 파티션의 시작 부분과 현재 문서의orderDate값에서10개월을 뺀 범위 내에서orderDate값을 포함하는 문서 사이에 있는 문서들에 대한orderDate값 배열을 반환합니다.
이전 값과의 비교 예시
다음 예시 $shift 연산자 및 $set 단계와 함께 $setWindowFields을 사용하여 컬렉션 의 필드를 비교합니다. 예시 출력에서 priceComparison 필드 비교 결과가 표시됩니다.
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$type", sortBy: { orderDate: 1 }, output: { previousPrice: { $shift: { output: "$price", by: -1 } } } } }, { $set: { priceComparison: { $cond: [ { $eq: ["$price", "$previousPrice"] }, "same", { $cond: [ { $gt: ["$price", "$previousPrice"] }, "higher", "lower" ] } ] } } }, ] )
[ { _id: 0, type: 'chocolate', orderDate: ISODate('2020-05-18T14:10:30.000Z'), state: 'CA', price: 13, quantity: 120, previousPrice: null, priceComparison: 'higher' }, { _id: 1, type: 'chocolate', orderDate: ISODate('2021-03-20T11:30:05.000Z'), state: 'WA', price: 14, quantity: 140, previousPrice: 13, priceComparison: 'higher' }, { _id: 5, type: 'strawberry', orderDate: ISODate('2019-01-08T06:12:03.000Z'), state: 'WA', price: 43, quantity: 134, previousPrice: null, priceComparison: 'higher' }, { _id: 4, type: 'strawberry', orderDate: ISODate('2019-05-18T16:09:01.000Z'), state: 'CA', price: 41, quantity: 162, previousPrice: 43, priceComparison: 'lower' }, { _id: 3, type: 'vanilla', orderDate: ISODate('2020-02-08T13:13:23.000Z'), state: 'WA', price: 13, quantity: 104, previousPrice: null, priceComparison: 'higher' }, { _id: 2, type: 'vanilla', orderDate: ISODate('2021-01-11T06:31:15.000Z'), state: 'CA', price: 12, quantity: 145, previousPrice: 13, priceComparison: 'lower' } ]
예시:
partitionBy: "$type"컬렉션 의 문서를type으로 파티셔닝하여 각 유형의 계산이 별도로 유지되도록 합니다.sortBy: { orderDate: 1 }각 파티션의 문서를 오름차순(1)으로orderDate기준으로 정렬합니다.output.previousPrice$shift연산자 사용하여 같은 연도 내의 바로 이전 주문에서price를 캡처합니다.$set는priceComparison라는 새 필드 추가하고previousPrice와의 비교를 기반으로 해당 필드의 값을higher,lower또는same로 설정합니다.
다음 WeatherMeasurement 클래스는 날씨 측정값 컬렉션 의 문서를 나타냅니다.
[] public class WeatherMeasurement { [] public ObjectId Id { get; set; } [] public string LocalityId { get; set; } = null!; [] public DateTime MeasurementDateTime { get; set; } [] public float Rainfall { get; set; } [] public float Temperature { get; set; } }
MongoDB .NET/ C# 운전자 사용하여 $setWindowFields 집계 파이프라인 에 단계를 추가하려면 PipelineDefinition 객체 에서 UnionWith() 메서드를 호출합니다.
다음 예시 Rainfall 및 Temperature 필드를 사용하여 각 지역의 지난 달 누적 강우량, 이동 평균 기온, 중앙값 온도 및 90백분위 강우량을 계산하는 파이프라인 단계를 만듭니다.
var pipeline = new EmptyPipelineDefinition<WeatherMeasurement>() .SetWindowFields( partitionBy: w => w.LocalityId, sortBy: Builders<WeatherMeasurement>.Sort.Ascending( w => w.MeasurementDateTime), output: o => new { MonthlyRainfall = o.Sum( w => w.Rainfall, RangeWindow.Create( RangeWindow.Months(-1), RangeWindow.Current) ), TemperatureAvg = o.Average( w => w.Temperature, RangeWindow.Create( RangeWindow.Months(-1), RangeWindow.Current) ), MedianTemperature = o.Median( w => w.Temperature, RangeWindow.Create( RangeWindow.Months(-1), RangeWindow.Current) ), NinetiethPercentileRainfall = o.Percentile( w => w.Rainfall, new[] { 0.9 }, RangeWindow.Create( RangeWindow.Months(-1), RangeWindow.Current) ) } );
이 페이지의 Node.js 예시에서는 Atlas 샘플 데이터 세트의 sample_weatherdata.data 컬렉션을 사용합니다. 무료 MongoDB Atlas 클러스터를 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB Node.js 드라이버 문서의 시작하기를 참조하세요.
MongoDB Node.js 운전자 사용하여 집계 파이프라인 에 $setWindowFields 단계를 추가하려면 파이프라인 객체 에서 $setWindowFields 연산자 사용합니다.
다음 예시는 지난 한 달 동안 고유한 각 callLetters 값에 대해 airTemperature.value의 평균과 waveMeasurement.waves.height의 총계를 계산하는 파이프라인 단계를 만듭니다. 그리고 집계 파이프라인을 실행합니다.
const pipeline = [ { $setWindowFields: { partitionBy: "$callLetters", sortBy: { ts: 1 }, output: { temperatureAvg: { $avg: "$airTemperature.value", window: { range: [-1, "current"], unit: "month" } }, totalWaveHeight: { $sum: "$waveMeasurement.waves.height", window: { range: [-1, "current"], unit: "month" } } } } }, ]; const cursor = collection.aggregate(pipeline); return cursor;
팁
IOT 전력 소비에 대한 추가 예시는 IOT 전력 소비에 대한 추가 예시는 실용적인 MongoDB 집계 전자책을 참조하세요.