我正在使用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查询和过滤功能,并想寻求建议:
- 我的方法是在一个单一的文件中存储多个指标合理吗?我会更好地将度量标准保存为单个文档,然后以某种方式“合并”它们吗?
- 有没有一种方法可以实现我所需要的,而无需使用nodejs进行此操作(我认为这不会是非常快速的事情 - 抓取文档,然后迭代它们以创建新的结构并推出它)?
- 有没有更好的方法来做到这一点?虚拟模型或其他可以帮助猫鼬的东西?据我所知,mongoDB可能不是时间序列数据的正确选择,但它不是功能的唯一部分,mongoDB/mongoose组合似乎很好地服务于其他目的,我不想在技术中途改变技术。
是否有意义单独存储单个metricReports而不是将它们捆绑为数组?比方说,目前,度量报告是一个项目的单一日期标准幻灯片(假设有5个度量标准被捆绑在一起),如果我单独存储它们,我将有5个单独的文档(每个度量标准1个),但这似乎更容易过滤和减少。将这些文件捆绑成切片会稍微复杂一点,但从原子构建似乎比将复杂结构分解成砖更容易。 – abolotnov
当然,你可以做到这一点,无论你认为对你更好。如果在某些时候该结构不再有效,您可以对数据运行ETL以转换为其他格式。因为你不需要担心模式,所以在Mongo中稍后改变你的想法就容易多了。 –