将数据迁移到时间序列集合中
本页描述了如何使用聚合管道将数据迁移到时间序列集合中的方法。聚合管道。要了解如何使用 MongoDB 关系迁移器将数据迁移到时间序列集合中的方法,请参阅使用关系迁移器配置时间序列集合.
关于此任务
从 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
必须是日期类型。
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" } } } ] )
在运行此聚合管道后,您可以使用 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 } }
下一步操作
如果您的原始集合有二级索引,现在请手动重新创建它们。
如果您的时序集合包含在 1970-01-01T00:00:00.000Z
之前或 2038-01-19T03:14:07.000Z
之后的时间 timeField
值,MongoDB 将记录一条警告并禁用一些使用 内部聚簇索引 的查询优化。为了恢复查询性能并解决日志警告,请在 timeField
上创建一个二级索引。