Docs Menu
Docs Home
/
MongoDBマニュアル
/ /

時系列コレクションへのデータの移行

項目一覧

  • このタスクについて
  • 始める前に
  • 手順
  • オプション。メタデータフィールドを作成します。
  • 時系列コレクションを作成し、データを挿入します。
  • 次のステップ

このページでは、 集計パイプラインを使用してデータを時系列コレクションに移行する方法について説明します。他の方法として、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
}
}
)
1

コレクションにすべてのメタデータを含む特定のフィールドが含まれていない場合は、データを変換してメタデータを定義してください。

次のパイプラインステージでは、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
}
}
2

以下の例では、次の操作を実行します。

  • $addFields 集計ステージを使用して、weather_data コレクションに metaData フィールドを追加する。

  • timeseries オプションと合わせて $out 集計ステージを使用して、mydatabase データベースに weathernew 時系列コレクションを作成する。

  • weathernew コレクションの metaFieldmetaData フィールドとして定義する。

  • weathernew コレクションの timeFieldts フィールドとして定義する。

注意

時系列コレクションの timeFielddate 型である必要があります。

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セカンダリインデックスを作成してください

Tip

以下も参照してください。

戻る

粒度の設定