$densify (집계)
이 페이지의 내용
정의
$densify
버전 5.1에 추가되었습니다.
필드의 특정 값이 누락된 문서 시퀀스에서 새 문서를 만듭니다.
$densify
를 사용하여 다음을 수행할 수 있습니다.time series 데이터의 공백을 메웁니다.
데이터 그룹 간에 누락된 값을 추가합니다.
지정된 값 범위로 데이터를 채웁니다.
구문
$densify
단계의 구문은 다음과 같습니다.
{ $densify: { field: <fieldName>, partitionByFields: [ <field 1>, <field 2> ... <field n> ], range: { step: <number>, unit: <time unit>, bounds: < "full" || "partition" > || [ < lower bound >, < upper bound > ] } } }
$densify
단계는 다음 필드가 포함된 문서를 사용합니다.
필드 | 필요성 | 설명 |
---|---|---|
필수 사항 | 밀도를 높일 필드입니다. 지정된 지정된 내장된 문서나 배열에 | |
옵션 | 문서를 그룹 하기 위한 복합 키 역할을 하는 필드 설정하다 입니다. 단계에서는 각 이 필드 를 생략하면 는 전체 컬렉션 에 대해 하나의 파티션을 예시 는 파티션을 사용한 밀도화를 참조하세요. | |
필수 사항 | 데이터 밀도화 방법을 지정하는 객체입니다. | |
필수 사항 | 다음 중 하나로
| |
필수 사항 | ||
필드 가 날짜인 경우 필수 사항입니다. |
동작 및 제한 사항
field
제한 사항
partitionByFields
제한 사항
partitionByFields $densify
배열에 필드 이름이 있는 경우 다음에서 오류가 발생합니다.
문자열이 아닌 값으로 평가합니다.
$
로 시작합니다.
range.bounds
행동
range.bounds가 배열인 경우 다음과 같습니다.
출력 순서
$densify
출력하는 문서의 정렬 순서를 보장하지 않습니다.
정렬 순서를 보장하려면 정렬 기준으로 삼으려는 필드에 $sort
를 사용합니다.
예시
time series 데이터 밀도화
4시간 간격으로 측정된 온도를 포함하는 weather
컬렉션을 만듭니다.
db.weather.insertMany( [ { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-18T00:00:00.000Z"), "temp": 12 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-18T04:00:00.000Z"), "temp": 11 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-18T08:00:00.000Z"), "temp": 11 }, { "metadata": { "sensorId": 5578, "type": "temperature" }, "timestamp": ISODate("2021-05-18T12:00:00.000Z"), "temp": 12 } ] )
이 예에서는 $densify
단계를 사용하여 4시간 간격 사이의 간격을 채워 데이터 요소에 대한 시간별 세분성을 달성합니다.
db.weather.aggregate( [ { $densify: { field: "timestamp", range: { step: 1, unit: "hour", bounds:[ ISODate("2021-05-18T00:00:00.000Z"), ISODate("2021-05-18T08:00:00.000Z") ] } } } ] )
예시:
$densify
단계는 기록된 온도 사이의 시간 간격을 채웁니다.field: "timestamp"
timestamp
필드를 밀도화합니다.range:
step: 1
timestamp
필드를 1단위만큼 증가시킵니다.unit: hour
timestamp
필드를 시간별로 밀도화합니다.bounds: [ ISODate("2021-05-18T00:00:00.000Z"), ISODate("2021-05-18T08:00:00.000Z") ]
밀도화되는 시간 범위를 설정합니다.
다음 출력에서 $densify
단계는 00:00:00
및 08:00:00
시간 사이의 시간 간격을 채웁니다.
[ { _id: ObjectId("618c207c63056cfad0ca4309"), metadata: { sensorId: 5578, type: 'temperature' }, timestamp: ISODate("2021-05-18T00:00:00.000Z"), temp: 12 }, { timestamp: ISODate("2021-05-18T01:00:00.000Z") }, { timestamp: ISODate("2021-05-18T02:00:00.000Z") }, { timestamp: ISODate("2021-05-18T03:00:00.000Z") }, { _id: ObjectId("618c207c63056cfad0ca430a"), metadata: { sensorId: 5578, type: 'temperature' }, timestamp: ISODate("2021-05-18T04:00:00.000Z"), temp: 11 }, { timestamp: ISODate("2021-05-18T05:00:00.000Z") }, { timestamp: ISODate("2021-05-18T06:00:00.000Z") }, { timestamp: ISODate("2021-05-18T07:00:00.000Z") }, { _id: ObjectId("618c207c63056cfad0ca430b"), metadata: { sensorId: 5578, type: 'temperature' }, timestamp: ISODate("2021-05-18T08:00:00.000Z"), temp: 11 } { _id: ObjectId("618c207c63056cfad0ca430c"), metadata: { sensorId: 5578, type: 'temperature' }, timestamp: ISODate("2021-05-18T12:00:00.000Z"), temp: 12 } ]
파티션을 통한 밀도화
두 가지 종류의 커피 원두에 대한 데이터가 포함된 coffee
컬렉션을 만듭니다.
db.coffee.insertMany( [ { "altitude": 600, "variety": "Arabica Typica", "score": 68.3 }, { "altitude": 750, "variety": "Arabica Typica", "score": 69.5 }, { "altitude": 950, "variety": "Arabica Typica", "score": 70.5 }, { "altitude": 1250, "variety": "Gesha", "score": 88.15 }, { "altitude": 1700, "variety": "Gesha", "score": 95.5, "price": 1029 } ] )
전체 값 범위의 밀도화
이 예에서는 $densify
를 사용하여 각 커피 variety
에 대해 altitude
필드를 밀도화합니다.
db.coffee.aggregate( [ { $densify: { field: "altitude", partitionByFields: [ "variety" ], range: { bounds: "full", step: 200 } } } ] )
집계 예시:
variety
로 문서를 분할하여Arabica Typica
커피에 대한 그룹과Gesha
커피에 대한 그룹을 하나씩 만듭니다.full
범위를 지정합니다. 즉, 각 파티션에 대한 기존 문서의 전체 범위에 걸쳐 데이터가 밀도화됩니다.step
을200
으로 지정합니다. 이는 새 문서가200
의altitude
간격으로 생성됨을 의미합니다.
집계는 다음 문서를 반환합니다.
[ { _id: ObjectId("618c031814fbe03334480475"), altitude: 600, variety: 'Arabica Typica', score: 68.3 }, { _id: ObjectId("618c031814fbe03334480476"), altitude: 750, variety: 'Arabica Typica', score: 69.5 }, { variety: 'Arabica Typica', altitude: 800 }, { _id: ObjectId("618c031814fbe03334480477"), altitude: 950, variety: 'Arabica Typica', score: 70.5 }, { variety: 'Gesha', altitude: 600 }, { variety: 'Gesha', altitude: 800 }, { variety: 'Gesha', altitude: 1000 }, { variety: 'Gesha', altitude: 1200 }, { _id: ObjectId("618c031814fbe03334480478"), altitude: 1250, variety: 'Gesha', score: 88.15 }, { variety: 'Gesha', altitude: 1400 }, { variety: 'Gesha', altitude: 1600 }, { _id: ObjectId("618c031814fbe03334480479"), altitude: 1700, variety: 'Gesha', score: 95.5, price: 1029 }, { variety: 'Arabica Typica', altitude: 1000 }, { variety: 'Arabica Typica', altitude: 1200 }, { variety: 'Arabica Typica', altitude: 1400 }, { variety: 'Arabica Typica', altitude: 1600 } ]
이 이미지는 $densify
로 만든 문서를 시각화한 것입니다.
더 어두운 사각형은 컬렉션에 있는 원본 문서를 나타냅니다.
밝은 사각형은
$densify
로 만든 문서를 나타냅니다.
각 파티션 내 값 밀도화
이 예시에서는 $densify
를 사용하여 각 variety
내의 altitude
필드의 간격만 밀도화합니다.
db.coffee.aggregate( [ { $densify: { field: "altitude", partitionByFields: [ "variety" ], range: { bounds: "partition", step: 200 } } } ] )
집계 예시:
variety
로 문서를 분할하여Arabica Typica
커피에 대한 그룹과Gesha
커피에 대한 그룹을 하나씩 만듭니다.partition
범위를 지정합니다. 즉, 각 파티션 내에서 데이터가 밀도화됩니다.Arabica Typica
파티션의 경우 범위는600
-950
입니다.Gesha
파티션의 경우 범위는1250
-1700
입니다.
step
을200
으로 지정합니다. 이는 새 문서가200
의altitude
간격으로 생성됨을 의미합니다.
집계는 다음 문서를 반환합니다.
[ { _id: ObjectId("618c031814fbe03334480475"), altitude: 600, variety: 'Arabica Typica', score: 68.3 }, { _id: ObjectId("618c031814fbe03334480476"), altitude: 750, variety: 'Arabica Typica', score: 69.5 }, { variety: 'Arabica Typica', altitude: 800 }, { _id: ObjectId("618c031814fbe03334480477"), altitude: 950, variety: 'Arabica Typica', score: 70.5 }, { _id: ObjectId("618c031814fbe03334480478"), altitude: 1250, variety: 'Gesha', score: 88.15 }, { variety: 'Gesha', altitude: 1450 }, { variety: 'Gesha', altitude: 1650 }, { _id: ObjectId("618c031814fbe03334480479"), altitude: 1700, variety: 'Gesha', score: 95.5, price: 1029 } ]
이 이미지는 $densify
로 만든 문서를 시각화한 것입니다.
더 어두운 사각형은 컬렉션에 있는 원본 문서를 나타냅니다.
밝은 사각형은
$densify
로 만든 문서를 나타냅니다.