Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ /

시계열 컬렉션 만들기 및 쿼리Create and Query a Time Series Collection

이 페이지의 내용

  • Time Series 컬렉션 만들기
  • Time Series 컬렉션에 측정값 삽입
  • 시계열 컬렉션 쿼리
  • Time Series 컬렉션에서 집계 실행

이 페이지에서는 time series 컬렉션을 만들고 쿼리하는 방법을 코드 예제를 사용해 설명합니다.

중요

기능 호환성 버전 요구 사항

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

1

timeField 을 시간 데이터가 포함된 필드 로 정의하고 metaField 를 메타데이터 가 포함된 필드 로 정의합니다.

{
timeField: "timestamp",
metaField: "metadata"
}

이 예시 에서 timestamptimeField 의 이름이고 metadatametaField 의 이름입니다. timestamp 필드 의 값은 날짜 유형이어야 합니다.

중요

컬렉션 에 적합한 metaField 를 선택하면 저장 와 쿼리 성능이 모두 최적화됩니다. metaField 선택 및 권장사항 사항에 대한 자세한 내용은 metaFields를 참조하세요.

2

아래 두 가지 접근 방식 중 하나를 사용하여 각 데이터 버킷의 시간 간격을 정의합니다.

중요

Time Series 간격 변경

생성 후 collMod 메서드를 사용하여 세분성 또는 버킷 정의를 수정할 수 있습니다. 그러나 각 버킷에 적용되는 시간 범위를 늘릴 수만 있습니다. 줄일 수는 없습니다.

  1. granularity 필드를 정의합니다:

    {
    granularity: "seconds"
    }

    granularity 값 선택에 대한 자세한 내용은 세분성 고려 사항을 참조하세요.

또는

  1. MongoDB 6.3 이상에서는 bucketMaxSpanSecondsbucketRoundingSeconds 필드를 정의할 수 있습니다. 두 값은 모두 동일해야 합니다.

    {
    bucketMaxSpanSeconds: "300",
    bucketRoundingSeconds: "300"
    }
3

선택적으로, timeField 의 값이 그 이상 오래된 경우 문서가 만료되도록 expireAfterSeconds 를 설정합니다.

{
expireAfterSeconds: 86400
}
4

db.createCollection() 메서드 또는 create 명령을 사용하여 컬렉션 을 생성합니다. 다음 예시 에서는 db.createCollection() 메서드를 사용하여 weather time series 컬렉션 을 만듭니다.

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

time series 컬렉션에는 다음 필드가 포함됩니다.

필드
유형
설명
timeseries.timeField
문자열

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

timeseries.metaField
문자열

선택 사항. 각 time series 문서에 메타데이터가 포함된 필드의 이름입니다. 지정된 필드의 메타데이터는 고유한 문서 시리즈에 레이블을 지정하는 데 사용되는 데이터여야 합니다. 메타데이터는 거의 변경되지 않아야 하며, 지정된 필드의 이름이 _id 가 아니거나 timeseries.timeField 과 동일하지 않을 수 있습니다. 필드는 모든 데이터 유형이 가능합니다.

metaField 필드는 선택 사항이지만 메타데이터를 사용하면 쿼리 최적화를 개선할 수 있습니다. 예를 들어 MongoDB는 새 컬렉션에 대해 metaFieldtimeField 필드에 복합 인덱스를 자동으로 생성합니다 . 이 필드에 값을 제공하지 않으면 데이터는 시간을 기준으로만 버킷됩니다.

timeseries.granularity
integer

선택 사항입니다. bucketRoundingSecondsbucketMaxSpanSeconds 을 설정한 경우에는 사용하지 마십시오.

가능한 값은 seconds (기본값), minuteshours입니다.

연속적으로 들어오는 타임스탬프 사이의 시간과 가장 근접하게 일치하는 값으로 granularity 를 설정합니다. 이렇게 하면 MongoDB가 컬렉션에 데이터를 저장하는 방법을 최적화하여 성능이 향상됩니다.

세분 수준 및 버킷 간격에 대한 자세한 내용은 Time Series 데이터의 세부 수준 설정을 참조하세요.

timeseries.bucketMaxSpanSeconds
integer

선택 사항입니다. bucketRoundingSeconds와 함께 granularity의 대안으로 사용합니다. 같은 버킷에 있는 타임스탬프 사이의 최대 시간을 설정합니다.

가능한 값은 1-31536000입니다.

버전 6.3에 추가.

timeseries.bucketRoundingSeconds
integer

선택 사항. bucketMaxSpanSeconds와 함께 granularity의 대안으로 사용합니다. bucketMaxSpanSeconds와 같아야 합니다.

문서에 새 버킷이 필요한 경우 MongoDB는 문서의 타임스탬프 값을 이 간격으로 반올림하여 버킷의 최소 시간을 설정합니다.

버전 6.3에 추가.

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

Time Series 컬렉션에 국한되지 않는 다른 허용 옵션은 다음과 같습니다.

  • storageEngine

  • indexOptionDefaults

  • collation

  • writeConcern

  • comment

참조:

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

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() 방법을 사용합니다.

쿼리 성능 최적화

대규모 작업에 맞게 삽입을 최적화하는 방법을 학습 보려면 삽입 권장사항을 참조하세요.

표준 MongoDB 컬렉션을 쿼리하는 것과 동일한 방식으로 time-series 컬렉션을 쿼리합니다.

time series 컬렉션에서 하나의 문서를 반환하려면 다음을 실행하세요.

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

출력 예시:

{
timestamp: ISODate("2021-05-18T00:00:00.000Z"),
metadata: { sensorId: 5578, type: 'temperature' },
temp: 12,
_id: ObjectId("62f11bbf1e52f124b84479ad")
}

Time Series 쿼리에 대한 자세한 내용은 쿼리 권장사항을 참조하세요.

추가 쿼리 기능을 사용하려면 다음과 같은 aggregation pipeline을 사용하십시오.

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" }
}
}
] )

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

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

돌아가기

생성 및 구성