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데이터베이스에weathernewTime 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 컬렉션 모범 사례를 참조하세요.
다음 단계
원래 컬렉션에 세컨더리 인덱스가 있는 경우 지금 수동으로 다시 생성합니다.
Time Series 컬렉션에 1970-01-01T00:00:00.000Z 이전 또는 2038-01-19T03:14:07.000Z 이후의 timeField 값이 포함되어 있는 경우 MongoDB는 경고를 기록하고 내부 클러스터형 인덱스를 활용하는 일부 쿼리 최적화를 비활성화합니다. 쿼리 성능을 회복하고 로그 경고를 해결하려면 timeField에 보조 인덱스를 생성하세요.