使用 LoopBack 返回总和

问题描述 投票:0回答:2

我找不到使用 LoopBack 执行此操作的方法,我想也许有人可以提供帮助,或者为我指出一种替代/推荐的方法来执行此操作。

我有一个“流量”模型,如下所示:

{
  "fromTime": "string",
  "toTime": "string",
  "trafficTypeId": 0,
  "totalPackets": 0,
  "totalSize": "string",
  "id": 0
}

现在,每个模型都是按一定的时间间隔制作的,比如从16:00到16:05,并且它保留了这段时间处理的总数据包和大小。

我需要显示一个图表,将其显示从每小时/每天/每周等更改。

我该如何做才能使求和不会在客户端发生,因为我担心可能会出现性能问题(当尝试使用 5 分钟间隔求和一个月时)?相反,我想创建一个函数,它接受 2 个参数:

startTime
endTime
,并返回 1 个对象,其中包含这次数据包的总和和总大小?

我看过远程方法,但它似乎不符合我的需求。难道是我理解错了?

还有其他推荐的方法可以尝试吗?

编辑:是否可以调用这样的东西:

traffic.find({'where': {`fromTime': {gt: SOME_TIME}, 'toTime': {lt: SOME_OTHER_TIME } }); // (using AngularJS)

并将返回的数据传递给我将编码的远程方法,以总结我想要的值?

loopbackjs strongloop
2个回答
4
投票

远程方法可以解决此问题,您认为为什么不行?无需调用内置查询方法,只需使用 Node 语法来查询数据库并在后端进行所有求和。您不需要首先调用数据,然后将数据从客户端发送回远程方法,只需将其全部打包到一个远程方法中即可:

traffic.js 中类似这样的东西:

module.exports = function(Traffic) {

  Traffic.getGraphData = function (fromTime, toTime, cb) {

    let filter = {
      where: {
        fromTime: {gt: fromTime},
        toTime: {lt: toTime}
      }
    };

    Traffic.find(filter, function(err, trafficResults) {

      if(err) return cb(err); // error out and return err msg to client

      let graphData = {
        // properties to support graph display
      };

      // loop on trafficResults to do Summation here
      // collect results inside graphData

      // return clean graphData to client
      cb(null, graphData);

    });

  }

  Traffic.remoteMethod('getGraphData', {
    accepts: [
      { arg: 'fromTime', type: 'number' },
      { arg: 'toTime', type: 'number' }
    ],
    returns: { arg: 'graphData', type: 'object' }
  });

};

0
投票
const sum = (items, prop)=>{
    return items.reduce( function(a, b){
        return a + b[prop];
    }, 0);
}


 const dataList = traffic.find({'where': {`fromTime': {gt: SOME_TIME}, 'toTime': {lt: SOME_OTHER_TIME } }); // (using AngularJS)
const result = sum(dataList, 'totalPackets') 


// if you want sum totalPackets in list

console.log('result',result)
© www.soinside.com 2019 - 2024. All rights reserved.