Docs Menu
Docs Home
/
MongoDB 매뉴얼

Time Series 컬렉션

이 페이지의 내용

  • Time Series 컬렉션
  • 절차
  • 행동

버전 5.0에 추가.

Time series 컬렉션 은 일정 기간 동안의 측정 시퀀스를 효율적으로 저장합니다. 시계열 데이터는 시간이 지남에 따라 수집되며 하나 이상의 변경되지 않는 매개변수로 고유하게 식별되는 모든 데이터입니다. Time Series 데이터를 식별하는 불변의 매개변수는 일반적으로 데이터 소스의 메타데이터입니다.

예시
측정
Metadata

날씨 데이터

온도

센서 식별자, 위치

주식 데이터

주식 가격

주식 시세, 거래소

웹사이트 방문자

조회 수

URL

버전 5.0에 추가.

시계열 컬렉션은 시계열 데이터를 효율적으로 저장합니다. 시계열 컬렉션에서는 동일한 출처의 데이터가 비슷한 시점의 다른 데이터 포인트와 함께 저장되도록 쓰기가 구성됩니다.

일반 컬렉션과 비교하여 시계열 데이터를 시계열 컬렉션에 저장하면 쿼리 효율성이 향상되고 시계열 데이터 및 세컨더리 인덱스의 디스크 사용량이 줄어듭니다.

참고

featureCompatibilityVersion 이 5.0 으로 설정된 시스템에서만 time series 컬렉션을 만들 수 있습니다.

time series 컬렉션에 데이터를 삽입하려면 먼저 db.createCollection() 메서드 또는 create 명령을 사용하여 collection을 명시적으로 생성해야 합니다.

db.createCollection(
"weather",
{
timeseries: {
timeField: "timestamp",
metaField: "metadata",
granularity: "hours"
}
}
)

time series 컬렉션을 만들 때 다음 옵션을 지정합니다.

필드
유형
설명

timeseries.timeField

문자열

필수입니다. 각 time series 문서에서 날짜를 포함하는 필드의 이름입니다. time series 컬렉션의 문서에는 timeField 값으로 유효한 BSON 날짜가 있어야 합니다.

timeseries.metaField

문자열

선택 사항입니다. 각 time series 문서에 메타데이터가 포함된 필드의 이름입니다. 지정된 필드의 메타데이터는 고유한 문서 시리즈에 레이블을 지정하는 데 사용되는 데이터여야 합니다. 메타데이터는 거의 변경되지 않아야 합니다.

지정한 필드의 이름이 _id 이거나 timeseries.timeField과 같지 않을 수 있습니다. 필드는 모든 유형이 가능합니다.

timeseries.granularity

문자열

선택 사항. 가능한 값은 "seconds", "minutes""hours" 입니다. 기본적으로 MongoDB는 높은 빈도의 수집을 위해 granularity"seconds" 로 설정합니다.

Time Series 컬렉션의 데이터가 내부적으로 저장되는 방식을 최적화하여 성능을 향상시키려면 granularity 매개변수를 수동으로 설정합니다. granularity의 값을 선택하려면 연속 수신 측정값 사이의 시간 범위와 가장 일치하는 값을 선택합니다.

timeseries.metaField를 지정하는 경우 metaField 필드에 대해 동일한 고유 값을 갖는 연속 수신 측정값 사이의 시간 범위를 고려합니다. 측정값이 동일한 소스에서 나온 경우 metaField 필드에 대해 동일한 고유 값을 갖는 경우가 많습니다.

timeseries.metaField를 지정하지 않는 경우 컬렉션에 삽입된 모든 측정값 사이의 시간 범위를 고려합니다.

expireAfterSeconds

숫자

선택 사항. 문서가 만료되기 전까지의 시간(초)을 지정하여 time series collection 문서를 자동으로 삭제할 수 있습니다. MongoDB는 만료된 문서를 자동으로 삭제합니다. 자세한 내용 은 time series 컬렉션(TTL)에 대한 자동 제거 설정을 참조하세요.

timeseries 옵션과 함께 허용되는 다른 옵션은 다음과 같습니다.

  • storageEngine

  • indexOptionDefaults

  • collation

  • writeConcern

  • comment

참조:

경고

MongoDB Server가 충돌하므로 system.profile 이라는 이름의 time series 컬렉션 또는 뷰를 만들려고 시도하지 마세요.

삽입하는 각 문서에는 단일 측정값이 포함되어야 합니다. 한 번에 여러 문서를 삽입하려면 다음 명령을 실행합니다.

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
},
{
"metadata": { "sensorId": 5578, "type": "temperature" },
"timestamp": ISODate("2021-05-18T16:00:00.000Z"),
"temp": 16
},
{
"metadata": { "sensorId": 5578, "type": "temperature" },
"timestamp": ISODate("2021-05-18T20:00:00.000Z"),
"temp": 15
}, {
"metadata": { "sensorId": 5578, "type": "temperature" },
"timestamp": ISODate("2021-05-19T00:00:00.000Z"),
"temp": 13
},
{
"metadata": { "sensorId": 5578, "type": "temperature" },
"timestamp": ISODate("2021-05-19T04:00:00.000Z"),
"temp": 12
},
{
"metadata": { "sensorId": 5578, "type": "temperature" },
"timestamp": ISODate("2021-05-19T08:00:00.000Z"),
"temp": 11
},
{
"metadata": { "sensorId": 5578, "type": "temperature" },
"timestamp": ISODate("2021-05-19T12:00:00.000Z"),
"temp": 12
},
{
"metadata": { "sensorId": 5578, "type": "temperature" },
"timestamp": ISODate("2021-05-19T16:00:00.000Z"),
"temp": 17
},
{
"metadata": { "sensorId": 5578, "type": "temperature" },
"timestamp": ISODate("2021-05-19T20:00:00.000Z"),
"temp": 12
}
] )

단일 문서를 삽입하려면 db.collection.insertOne() 방법을 사용합니다.

time series 컬렉션에서 하나의 문서를 검색하려면 다음 명령을 실행합니다.

db.weather.findOne({
"timestamp": ISODate("2021-05-18T00:00:00.000Z")
})

추가 쿼리 기능을 사용하려면 다음과 같은 집계 파이프라인을 사용하십시오.

db.weather.aggregate( [
{
$project: {
date: {
$dateToParts: { date: "$timestamp" }
},
temp: 1
}
},
{
$group: {
_id: {
date: {
year: "$date.year",
month: "$date.month",
day: "$date.day"
}
},
avgTmp: { $avg: "$temp" }
}
}
] )

예시된 집계 파이프라인은 모든 문서를 측정 날짜별로 그룹화한 다음, 해당 날짜의 모든 온도 측정값의 평균을 반환합니다.

{
"_id" : {
"date" : {
"year" : 2021,
"month" : 5,
"day" : 18
}
},
"avgTmp" : 12.714285714285714
}
{
"_id" : {
"date" : {
"year" : 2021,
"month" : 5,
"day" : 19
}
},
"avgTmp" : 13
}

컬렉션이 Time Series 유형인지 확인하려면 listCollections 명령을 사용하세요.

db.runCommand( { listCollections: 1.0 } )

컬렉션이 time series 컬렉션인 경우 다음을 반환합니다.

{
cursor: {
id: <number>,
ns: 'test.$cmd.listCollections',
firstBatch: [
{
name: <string>,
type: 'timeseries',
options: {
expireAfterSeconds: <number>,
timeseries: { ... }
},
...
},
...
]
}
}

Time series 컬렉션은 일반 컬렉션처럼 작동합니다. 평소와 같이 데이터를 삽입하고 쿼리할 수 있습니다. MongoDB는 시계열 컬렉션을 삽입 시 시계열 데이터를 최적화된 저장 형식으로 자동으로 구성하는 내부 컬렉션에 대한 쓰기 가능한 비실체화 뷰로 취급합니다.

time-series 컬렉션을 쿼리 경우, 측정값당 하나의 문서에 대해 작업하게 됩니다. time series 컬렉션에 대한 쿼리는 최적화된 내부 저장 형식을 활용하고 결과를 더 빠르게 반환합니다.

쿼리 성능을 향상시키려면 metaFieldtimeField로 지정된 필드에 보조 인덱스를 수동으로 추가할 수 있습니다.

Time series 컬렉션은 시간별로 데이터를 자동으로 정렬하고 인덱싱합니다. time series 컬렉션의 내부 인덱스는 listIndexes 로 표시되지 않습니다.

1970-01-01T00:00:00.000Z 이전 또는 2038-01-19T03:14:07.000Z 이후에 timeField 값이 있는 문서를 컬렉션에 삽입하면 MongoDB는 경고를 기록하고 일부 쿼리 최적화에서 내부 인덱스를 사용하지 못하도록 합니다. timeField세컨더리 인덱스를 생성하여 쿼리 성능을 회복하고 로그 경고를 해결합니다.

시계열 컬렉션은 컬렉션이 생성될 때 storageEngine 옵션을 사용하여 다른 압축 알고리즘을 지정하지 않는 한 전역 기본 압축 알고리즘인 snappy 를 무시하고 zstd 를 사용합니다. 예를 들어 새 weather 컬렉션에 대해 압축 알고리즘을 snappy 로 변경하려면 다음 옵션을 추가합니다.

db.createCollection(
"weather",
{
timeseries: {
timeField: "timestamp"
},
storageEngine: {
wiredTiger: {
configString: "block_compressor=snappy"
}
}
}
)

유효한 block_compressor 옵션은 다음과 같습니다.

  • snappy

  • zlib

  • zstd (기본값)

  • none

돌아가기

고정 사이즈 컬렉션

이 페이지의 내용