Node.js 如何在MongoDB中高效地更新时间序列数据

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:

我在mongodb中有以下时间序列数据

“通道”集合包含有关每个通道的数据。 每个通道文档都有real time data->rtData,它是一个json数组,保存该通道的时间序列数据

find({}).pretty()给出了类似的结构

  {
    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()
的条目。当然,您可以使用转换开始日期和结束日期的相同方法查询范围。有关更详细的说明,请参阅

其余的查询和聚合应该是显而易见的