在Meteor中在服务器上评估数据的最佳方法是什么

时间:2013-12-05 15:30:38

标签: json mongodb statistics meteor

我在服务器端创建了一些统计数据。它从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)?

我会对任何想法和建议表示感谢。

1 个答案:

答案 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

也许更简单,但它对于更大的数据集并不是很好,因为数据同时出现并且没有流式传输:

服务器:

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();