Node.js 如何在MongoDB中高效地更新时间序列数据
我在mongodb中有以下时间序列数据 “通道”集合包含有关每个通道的数据。 每个通道文档都有real time data->rtData,它是一个json数组,保存该通道的时间序列数据 find({}).pretty()给出了类似的结构Node.js 如何在MongoDB中高效地更新时间序列数据,node.js,mongodb,Node.js,Mongodb,我在mongodb中有以下时间序列数据 “通道”集合包含有关每个通道的数据。 每个通道文档都有real time data->rtData,它是一个json数组,保存该通道的时间序列数据 find({}).pretty()给出了类似的结构 { channelName:"ABC", rtData:[ { ts:ISO_DATE(timestamp), data:[12, 14] }, { ts:
{
channelName:"ABC",
rtData:[
{
ts:ISO_DATE(timestamp),
data:[12, 14]
},
{
ts:ISO_DATE(timestamp),
data:[12, 14]
},
{
ts:ISO_DATE(timestamp),
data:[12, 14]
},
.
.
.
},
{
channelName:"NBC",
rtData:[
{
ts:ISO_DATE(timestamp),
data:[12, 14]
},
{
ts:ISO_DATE(timestamp),
data:[12, 14]
},
{
ts:ISO_DATE(timestamp),
data:[12, 14]
},
.
.
.
},
现在,每4秒钟我就会收到一个或多个频道的更新记录
{
ts: ISO_DATE(timestamp),
data: [14,15]
}
我需要在该通道的rtData数组中推送/更新此记录
所以我所做的与此类似-
channels.findOne({query}, function(channel) {
channel.rtData.push(newData);
channels.findAndModify({query}, {$set:{rtData: channel.rtData}},
function({}))
})
找到通道,将数据推送到rtData数组中,然后进行查找和修改
现在,在数据量较低的情况下,这似乎是可行的。但当一个通道的rtData数组中有近50K个元素时,应用程序无法处理这一点
是否有一个有效的方法来更新时间序列数据。您的模型嵌入过多,imho。请记住,MongoDB中的BSON文档有16MB的大小限制。 此外,修改文档比简单地插入文档要花费更多的时间 由于and另外为每个输入值提供了唯一性,例如
{
_id: new ObjectID(),
channelName: "NBC",
value: [14,15]
}
使插入数据非常高效。对于基于日期的查询,您可以利用ObjectID以包含自历元起秒数的4字节值的十六进制表示形式开始,否则将单调递增:
secs = Math.floor(Date.Now()/1000)
hexSecs = secs.toString(16)
id = ObjectId(hexSecs+"0000000000000000")
db.values.find({"_id":{$lt:id}})
此示例将为您提供所有早于调用时间Date.Now()
的条目。当然,您可以使用转换开始日期和结束日期的相同方法查询范围。有关更详细的说明,请参阅
其余的查询和聚合应该是显而易见的