MongoDB 버전 7.0부터 $out
집계 단계를 사용하여 기존 컬렉션의 데이터를 Time Series 컬렉션으로 마이그레이션할 수 있습니다.
참고
MongoDB는 $out
을 사용하여 데이터를 Time Series 컬렉션으로 마이그레이션할 때 출력 순서를 보장하지 않습니다. 순서를 유지하려면 집계 파이프라인을 사용하여 마이그레이션하기 전에 데이터를 정렬하세요.
시작하기 전에
시간 및 메타데이터 정보를 포함하는 weatherdata
컬렉션을 고려해 보세요.
db.weatherdata.insertOne( { _id: ObjectId("5553a998e4b02cf7151190b8"), st: "x+47600-047900", ts: ISODate("1984-03-05T13:00:00Z"), position: { type: "Point", coordinates: [ -47.9, 47.6 ] }, elevation: 9999, callLetters: "VCSZ", qualityControlProcess: "V020", dataSource: "4", type: "FM-13", airTemperature: { value: -3.1, quality: "1" }, dewPoint: { value: 999.9, quality : "9" }, pressure: { value: 1015.3, quality: "1" }, wind: { direction: { angle: 999, quality: "9" }, type: "9", speed: { rate: 999.9, quality: "9" } }, visibility: { distance: { value: 999999, quality : "9" }, variability: { value: "N", quality: "9" } }, skyCondition: { ceilingHeight: { value: 99999, quality: "9", determination: "9" }, cavok: "N" }, sections: [ "AG1" ], precipitationEstimatedObservation: { discrepancy: "2", estimatedWaterDepth: 999 } } )
단계
메타데이터 필드를 만듭니다.
컬렉션에 각 시리즈를 식별할 수 있는 필드가 포함되어 있지 않으면 데이터를 변환하여 필드를 정의하세요. 이 예시에서 metaData
필드는 사용자가 만든 Time Series 컬렉션의 metaField
가 됩니다.
참고
Time Series metaField
및 grandularity
로 적절한 필드를 선택하면 저장과 쿼리 성능을 모두 최적화할 수 있습니다. 필드 선택과 모범 사례에 대한 자세한 정보는 metaField 및 세분성 모범 사례를 참조하세요.
아래 파이프라인은 다음 작업을 수행합니다.
$addFields
를 사용하여weather_data
컬렉션에metaData
필드를 추가합니다.$project
를 사용하여 문서의 나머지 필드를 포함하거나 제외합니다.
db.weather_data.aggregate([ { $addFields: { metaData: { "st": "$st", "position": "$position", "elevation": "$elevation", "callLetters": "$callLetters", "qualityControlProcess": "$qualityControlProcess", "type": "$type" } }, }, { $project: { _id: 1, ts: 1, metaData: 1, dataSource: 1, airTemperature: 1, dewPoint: 1, pressure: 1, wind: 1, visibility: 1, skyCondition: 1, sections: 1, precipitationEstimatedObservation: 1 } } ])
Time Series 컬렉션을 생성하고 데이터를 삽입합니다.
파이프라인에 $out
집계 단계를 추가하여 Time Series 컬렉션을 생성하고 데이터를 삽입합니다. 아래 파이프라인은 다음 작업을 수행합니다.
timeseries
옵션과$out
을 함께 사용하여mydatabase
데이터베이스에weathernew
Time Series 컬렉션을 생성합니다.metaData
필드를weathernew
컬렉션의metaField
로 정의합니다.ts
필드를weathernew
컬렉션의timeField
로 정의합니다.참고
Time Series 컬렉션의
timeField
는 날짜 유형이어야 합니다.
{ $out: { db: "mydatabase", coll: "weathernew", timeseries: { timeField: "ts", metaField: "metaData", granularity: "seconds" } } }
집계 단계 구문은 $out
을 참조하세요. time series 옵션에 대한 전체 설명은 time series 필드 참조를 참조하세요.
데이터 검토
이 집계 파이프라인을 실행한 후 findOne()
을 사용하여 weathernew
Time Series 컬렉션의 문서를 볼 수 있습니다.
db.weathernew.findOne()
연산은 다음 문서를 반환합니다.
{ _id: ObjectId("5553a998e4b02cf7151190b8"), ts: ISODate("1984-03-05T13:00:00Z"), metaData: { st: "x+47600-047900", position: { type: "Point", coordinates: [ -47.9, 47.6 ] }, elevation: 9999, callLetters: "VCSZ", qualityControlProcess: "V020", type: "FM-13" }, dataSource: "4", airTemperature: { value: -3.1, quality: "1" }, dewPoint: { value: 999.9, quality: "9" }, pressure: { value: 1015.3, quality: "1" }, wind: { direction: { angle: 999, quality: "9" }, type: "9", speed: { rate: 999.9, quality: "9" } }, visibility: { distance: { value: 999999, quality: "9" }, variability: { value: "N", quality: "9" } }, skyCondition: { ceilingHeight: { value: 99999, quality: "9", determination: "9" }, cavok: "N" }, sections: [ "AG1" ], precipitationEstimatedObservation: { discrepancy: "2", estimatedWaterDepth: 999 } }
다음 단계
원래 컬렉션에 세컨더리 인덱스가 있는 경우 지금 수동으로 다시 생성합니다.
Time Series 컬렉션에 1970-01-01T00:00:00.000Z
이전 또는 2038-01-19T03:14:07.000Z
이후의 timeField
값이 포함되어 있는 경우 MongoDB는 경고를 기록하고 내부 클러스터형 인덱스를 활용하는 일부 쿼리 최적화를 비활성화합니다. 쿼리 성능을 회복하고 로그 경고를 해결하려면 timeField
에 보조 인덱스를 생성하세요.