2017-02-16 176 views
0

我正在使用mongoDB和mongoose来存储指标数据。它被存储为一个引用存储的项目和度量标准类型的度量数组的文档。汇总时间序列数据

这样做的模式是这样的:

exports.metricReportSchema = new Schema({ 
    metrics: [{ 
     metric: { 
      type: mongoose.Schema.Types.ObjectId, 
      ref: 'metricSchema', 
      required: true 
     }, 
     value: { 
      type: String, 
      required: true 
     } 
    }], 
    project: { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'projectSchema', 
     required: true 
    }, 
    reportDate: Date 
}); 

实际的文档看起来如下:

db.metricreports.findOne() { 
    "_id" : ObjectId("58a60e8459dd3d12ef8c5d51"), 
    "reportDate" : ISODate("2017-02-16T20:41:40.657Z"), 
    "project" : ObjectId("58a20f5f04ef5789d3ef8faa"), 
    "metrics" : [ 
     { 
      "metric" : ObjectId("58a20f5f04ef5789d3ef8fb7"), 
      "value" : "781", 
      "_id" : ObjectId("58a60e8459dd3d12ef8c5d52") 
     }, { 
      "metric" : ObjectId("58a21106fc2aef8a10ded196"), 
      "value" : "566", 
      "_id" : ObjectId("58a60e8459dd3d12ef8c5d53") 
     }, { 
      "metric" : ObjectId("58a2141bded78e8ad8384f97"), 
      "value" : "501", 
      "_id" : ObjectId("58a60e8459dd3d12ef8c5d54") 
     }, { 
      "metric" : ObjectId("58a2141bded78e8ad8384f94"), 
      "value" : "44", 
      "_id" : ObjectId("58a60e8459dd3d12ef8c5d55") 
     }, { 
      "metric" : ObjectId("58a2141bded78e8ad8384f93"), 
      "value" : "645", 
      "_id" : ObjectId("58a60e8459dd3d12ef8c5d56") 
     } 
    ], 
    "__v" : 0 
} 

随着时间的推移,有存储数据的片这样的多份文件多个指标。选择和显示关于多个项目的指标的静态报告非常方便。

现在,当我尝试为项目的单个度量标准构建时间序列报表时,这变得并不复杂。

基本上,我需要做的是扫描多个MetricReport文档,并随时间从所有可用报告中提取单个单个Metric的数据。比方说,我有10个metricReports每个包含数据的10度不同的指标,我只想要提取一个,这很可能是这样的:

{ 
    "_id": "...", 
    "project": "...", 
    "metric": "...", 
    "data": { 
     "2016-02-02": "22", 
     "2016-02-03": "453", 
     ... 
    } 
} 

我不能找到一种方法与失做到这一点box mongoDB查询和过滤功能,并想寻求建议:

  1. 我的方法是在一个单一的文件中存储多个指标合理吗?我会更好地将度量标准保存为单个文档,然后以某种方式“合并”它们吗?
  2. 有没有一种方法可以实现我所需要的,而无需使用nodejs进行此操作(我认为这不会是非常快速的事情 - 抓取文档,然后迭代它们以创建新的结构并推出它)?
  3. 有没有更好的方法来做到这一点?虚拟模型或其他可以帮助猫鼬的东西?据我所知,mongoDB可能不是时间序列数据的正确选择,但它不是功能的唯一部分,mongoDB/mongoose组合似乎很好地服务于其他目的,我不想在技术中途改变技术。

回答

0
  1. 是的,但请记住,文档具有有限的大小(16 MB IIRC),所以如果你的数据是无界的,这种结构不会因为你的“指标”阵列将增长过去那种工作。

  2. 最终是的,即使你不能找出一个体面的过滤器查询,Mongo有MapReduce,它可以让你做你想做的事情,尽管它不会很容易。我会为此使用节点。

  3. 这里没有银弹。如果您需要汇总数据并将其存储为任意JSON(即由应用程序使用),并且不擅长执行复杂的数据联接/视图,则Mongo非常出色。应用程序级别的任何连接都会很慢。如果你想要表现,你必须将你的报告汇总成单个文件,并且保存&为他们服务。如果你有实时数据,这将会更加困难,因为你需要处理更新。

+0

是否有意义单独存储单个metricReports而不是将它们捆绑为数组?比方说,目前,度量报告是一个项目的单一日期标准幻灯片(假设有5个度量标准被捆绑在一起),如果我单独存储它们,我将有5个单独的文档(每个度量标准1个),但这似乎更容易过滤和减少。将这些文件捆绑成切片会稍微复杂一点,但从原子构建似乎比将复杂结构分解成砖更容易。 – abolotnov

+0

当然,你可以做到这一点,无论你认为对你更好。如果在某些时候该结构不再有效,您可以对数据运行ETL以转换为其他格式。因为你不需要担心模式,所以在Mongo中稍后改变你的想法就容易多了。 –