如何将数据从mongodb集合聚合到highstock系列数据格式

时间:2018-02-01 23:08:17

标签: node.js mongodb mongoose highcharts

我有以下猫鼬模式:

// UnitDataLogSchema Schema
var UnitDataLogSchema = new mongoose.Schema({
  serialnumber: {
    type: String
  },
  timestamp: Number,
  temperatures: []
});

所以我将获得一个包含以下数据的集合:

{ "_id" : 1, "timestamp": 100, "temperatures" : [1,2,3] }
{ "_id" : 1, "timestamp": 200, "temperatures" : [4,5,6] }
{ "_id" : 1, "timestamp": 300, "temperatures" : [7,8,9] }
{ "_id" : 1, "timestamp": 400, "temperatures" : [10,11,12] }
....

我如何聚合这个集合,以便我可以拥有这个最终对象:

{
  zonetemperatures:[
                    [ [100,1],[200,4],[300,7],[400,10] ],...
                    [ [100,2],[200,5],[300,8],[400,11] ],...
                    [ [100,3],[200,6],[300,9],[400,12] ],...
                   ]
} 

有了这个,我将有一个数组,每个元素都是Highstock图表中的一个系列。

我可以像这样在图表中轻松设置数据:

for (let index = 0; index < zonetemperatures.length; index++) {
  chart.series[index].setData(zonetemperatures[index]);

}
chart.redraw();

2 个答案:

答案 0 :(得分:0)

我通常在前端执行数据转换,以便将后端保留在那里进行查询。话虽如此,前端的一个解决方案如下:

// dataCollection is a json array of data returned by your back-end
// make sure it isn't empty, wrap it in an if possibly...
var seriesLength = dataCollection[0].temperatures.length;

for(var i = 0; i < seriesLength; i++) {
    var series = [];

    for(int j = 0; j < dataCollection.length; j++)
        series.push(dataCollection[j].temperatures[i]);

    chart.series[i].setData(series);
}

chart.redraw();

答案 1 :(得分:0)

试试这个..

db.unit_data.aggregate([{
        $unwind: "$temperatures"
    },
    {
        $project: {
            "zonetemperatures": ["$timestamp", "$temperatures"]
        }
    },
    {
        "$group": {
            _id: null,
            zonetemperatures: { $push: "$zonetemperatures" }
        }
    }
])