Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

$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의 값은 모두 숫자 값이거나 모두 날짜여야 합니다.

지정된 field를 포함하지 않는 문서는 수정되지 않은 채 파이프라인을 통해 계속됩니다.

내장된 문서나 배열에 <field> 기호를 지정하려면 점 표기법을사용하십시오.

field 제한 사항은 제한 사항을 참조하세요.

옵션

문서를 그룹 하기 위한 복합 키 역할을 하는 필드 설정하다 입니다. 단계에서는 각 $densify 문서 그룹 을 파티션 이라고 합니다.

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

예시 는 파티션을 사용한 밀도화를 참조하세요.

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

필수 사항

데이터 밀도화 방법을 지정하는 객체입니다.

필수 사항

다음 중 하나로 range.bounds를 지정할 수 있습니다.

  • An array: [ < lower bound >, < upper bound > ],

  • 문자열: "full" 또는 "partition".

bounds가 배열인 경우:

bounds"full"인 경우:

  • $densify 는 밀도화되는 의 전체 값 범위 에 걸친 문서를 field 추가합니다.

bounds"partition"인 경우:

  • $densify 는 각 파티션에 문서를 추가하며, 이는 full 각 파티션에서 개별적으로 범위 밀도화를 실행 한 경우와 유사합니다.

필수 사항

각 문서 에서 필드 값을 $densify 증가시킬 양입니다. 는 기존 문서 사이에 마다 새 문서 step 를 만듭니다.

범위.unit이 지정된 경우step 은 정수여야 합니다. 그렇지 않으면step 은 임의의 숫자 값일 수 있습니다.

필드 가 날짜인 경우 필수 사항입니다.

필드 의 날짜 값을 증가시킬 때 단계필드 에 적용 할 단위입니다.

unit에 대해 다음 값 중 하나를 문자열로 지정할 수 있습니다.

  • millisecond

  • second

  • minute

  • hour

  • day

  • week

  • month

  • quarter

  • year

예시 는 Time Series 데이터 밀도화를 참조하세요.

지정된 필드가 포함된 문서의 경우 다음에서 $densify 오류가 발생합니다.

  • 컬렉션의 문서에 날짜 유형의 field 값이 있고 단위 필드가 지정되지 않았습니다.

  • 컬렉션의 문서에 숫자 유형의 field 값이 있고 단위 필드가 지정되어 있습니다.

  • field 이름은 $로 시작합니다. 필드를 밀도화하려면 필드 이름을 변경해야 합니다. 필드 이름을 바꾸려면 $project를 사용합니다.

partitionByFields $densify 배열에 필드 이름이 있는 경우 다음에서 오류가 발생합니다.

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

  • $로 시작합니다.

range.bounds가 배열인 경우 다음과 같습니다.

  • 하한은 이미 컬렉션에 있는 문서와 관계없이 추가된 문서의 시작 값을 나타냅니다.

  • 하한은 포괄적입니다.

  • 상한은 배타적입니다.

  • $densify는 지정된 범위를 벗어난 필드 값을 가진 문서를 필터링하지 않습니다.

$densify 출력하는 문서의 정렬 순서를 보장하지 않습니다.

정렬 순서를 보장하려면 정렬 기준으로 삼으려는 필드에 $sort를 사용합니다.

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:0008: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 범위를 지정합니다. 즉, 각 파티션에 대한 기존 문서의 전체 범위에 걸쳐 데이터가 밀도화됩니다.

  • step200으로 지정합니다. 이는 새 문서가 200altitude 간격으로 생성됨을 의미합니다.

집계는 다음 문서를 반환합니다.

[
{
_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입니다.

  • step200으로 지정합니다. 이는 새 문서가 200altitude 간격으로 생성됨을 의미합니다.

집계는 다음 문서를 반환합니다.

[
{
_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로 만든 문서를 나타냅니다.

돌아가기

$currentOp