文档菜单
文档首页
/
MongoDB 手册
/ /

将数据迁移到时间序列集合中

本页内容

  • 关于此任务
  • 开始之前
  • 步骤
  • 可选:创建元数据字段。
  • 创建您的时间序列集合并插入您的数据。
  • 下一步

本页描述了如何使用聚合管道将数据迁移到时间序列集合中的方法。聚合管道。要了解如何使用 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
}
}
)
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 集合的 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"
}
}
}
] )

有关聚合阶段语法的更多信息,请参阅$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 }
}

如果您的原始集合有二级索引,现在请手动重新创建它们。

如果您的时序集合包含在 1970-01-01T00:00:00.000Z 之前或 2038-01-19T03:14:07.000Z 之后的时间 timeField 值,MongoDB 将记录一条警告并禁用一些使用 内部聚簇索引 的查询优化。为了恢复查询性能并解决日志警告,请在 timeField 上创建一个二级索引

提示

另请参阅

返回

设置粒度