MongoDB バージョン 7.0 以降では、$out
集計ステージを使用して、既存のコレクションから時系列コレクションにデータを移行できます。
注意
MongoDB は、$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
フィールドは作成する時系列コレクションの metaField
になります。
注意
時系列 metaField
および grandularity
として適切なフィールドを選択することで、ストレージとクエリのパフォーマンスの両方を最適化できます。フィールド選択とベストプラクティスの詳細については、「metaFieldと粒度のベストプラクティス」を参照してください。
以下のパイプラインは、次の操作を実行します。
$addFields
を使用して、metaData
フィールドをweather_data
コレクションに追加します。$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 } } ])
時系列コレクションを作成し、データを挿入します。
パイプラインに $out
集計ステージを追加し、時系列コレクションを作成し、その中にデータを挿入します。以下のパイプラインは、次の操作を実行します。
$out
をtimeseries
オプションと併用して、mydatabase
データベースにweathernew
時系列コレクションを作成する。metaData
フィールドをweathernew
コレクションのmetaField
として定義する。ts
フィールドをweathernew
コレクションのtimeField
として定義する。注意
時系列コレクションの
timeField
は date 型である必要があります。
{ $out: { db: "mydatabase", coll: "weathernew", timeseries: { timeField: "ts", metaField: "metaData", granularity: "seconds" } } }
集約ステージの構文については、$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
にセカンダリインデックスを作成してください。