我在服务器端创建了一些统计数据。它从MongoDB中存储的数据计算一次。它不是反应数据。
它以JSON格式存储,应该发送到客户端以通过nvd3在屏幕上显示。 这样做的最佳方法是什么?
也许这个计算应该在客户端完成?
例如: 使用数据创建一个数组:
d1 = [['2013-11-01', 123],['2013-11-02', 54],['2013-11-03', 98]];
和第二个数组:
d2 = [['2013-11-01', 432.99],['2013-11-02', 65.99],['2013-11-03', 23.54]];
两个数组都在一个图表上可视化。
用什么方法在服务器端生成(Meteor.methods,发布)数据以及如何从服务器端向客户端发送数据(Meteor.call,subscribe,HTTP.call)?
我会对任何想法和建议表示感谢。
答案 0 :(得分:8)
有3种方法可以做到这一点。您可以使用发布/订阅生成数据,使用方法/调用或在客户端上进行计算。方法擅长提供短数据集。发布可以更好地处理更大的数据集。
我建议在客户端进行计算,因为您可以进行实时更改(排序更改,字段类型/重新缩放等)。您可以使用Transform来计算数据。
当您拥有更大的数据集时,这是最好的,因为数据可以流式传输到客户端而不是在一个大块中发送
服务器端
Meteor.publish("data", function(){
var d1 = [['2013-11-01', 123],['2013-11-02', 54],['2013-11-03', 98]];
var d2 = [['2013-11-01', 432.99],['2013-11-02', 65.99],['2013-11-03', 23.54]];
this.added("data", "1", {data: d1 });
this.added("data", "2", {data: d2 });
this.ready();
});
客户方:
Chartdata = new Meteor.Collection("data");
Meteor.subscribe("data");
data = Chartdata.find().fetch()
//Data is stored in an array
也许更简单,但它对于更大的数据集并不是很好,因为数据同时出现并且没有流式传输:
服务器:
Meteor.methods({
getData:function() {
var d1 = [['2013-11-01', 123],['2013-11-02', 54],['2013-11-03', 98]];
var d2 = [['2013-11-01', 432.99],['2013-11-02', 65.99],['2013-11-03', 23.54]];
return [d1, d2]
}
});
客户方:
Meteor.call("getData", function(err, result) {
console.log(result)
//Gives back an array with d1 in position 0 and d2 in position 1
});
这取决于您的偏好。如果你喜欢这样做,那就是最好的。问题是你必须将原始数据发布到客户端才能进行计算。
var Data = new Meteor.Collection("data");
//Use a transform to calculate your data
var transform = function(doc) {
//Calculate your value ? Not sure how you're doing this just an example with static data
var data = [['2013-11-01', 123],['2013-11-02', 54],['2013-11-03', 98]];
return data;
}
//result should now have the calculated data
var result = Data.find({}, { transform: transform }).fetch();