時系列コレクションへのデータの移行
このページでは、 集計パイプラインを使用してデータを時系列コレクションに移行する方法について説明します。他の方法として、MongoDB Relational Migrator を使用してデータを時系列コレクションに移行する方法については、「 Relational Migrator を使用した時系列コレクションの構成」を参照してください。
このタスクについて
MongoDB バージョン 7.0 以降では、 $out
集計ステージを使用して、既存のコレクションから時系列コレクションにデータを移行できます。コレクションに時間間隔をまたいで比較したいデータが保存されている場合は、時系列コレクションを使用してパフォーマンスとストレージを向上させます。時系列コレクションの利点について詳しくは、「時系列コレクション」を参照してください。
始める前に
時間とメタデータ情報を含む 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
フィールドを追加し、$project
を使用してドキュメント内の残りのフィールドを含めるまたは除外します。この例では、metaData
フィールドは作成する時系列コレクションの metaField
になります。
注意
時系列 metaField
として適切なフィールドを選択することで、ストレージとクエリのパフォーマンスの両方が最適化されます。metaField
の選択とベストプラクティスの詳細については、「metaFields」を参照してください。
{ $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 } }
時系列コレクションを作成し、データを挿入します。
以下の例では、次の操作を実行します。
$addFields
集計ステージを使用して、weather_data
コレクションにmetaData
フィールドを追加する。timeseries
オプションと合わせて$out
集計ステージを使用して、mydatabase
データベースにweathernew
時系列コレクションを作成する。weathernew
コレクションのmetaField
をmetaData
フィールドとして定義する。weathernew
コレクションのtimeField
をts
フィールドとして定義する。
注意
時系列コレクションの timeField
は date 型である必要があります。
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 } }, { $out: { db: "mydatabase", coll: "weathernew", timeseries: { timeField: "ts", metaField: "metaData" } } } ] )
集約ステージの構文については、$out
を参照してください。時系列オプションの総合的な詳細については、「時系列フィールドのリファレンス」を参照してください。
この集計パイプラインを実行すると、findOne()
を使用して weathernew
時系列コレクション内のドキュメントを表示できます。
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 } }
次のステップ
元のコレクションにセカンダリ インデックスがある場合は、それらを手動で再作成します。
時系列コレクションに timeField
の値が 2038-01-19T03:14:07.000Z
の前または 1970-01-01T00:00:00.000Z
の後に含まれている場合、MongoDB は警告をログに記録し、内部クラスター化インデックスを使用する一部のクエリ最適化を無効にします。クエリのパフォーマンスを回復してログ警告を解決するには、timeField
にセカンダリインデックスを作成してください。