组水线 - 按天计算

时间:2015-10-19 12:43:38

标签: javascript node.js mongodb sails.js waterline

我试图找出如何打印日志文件的概述。

为此,我想返回一个包含每天peek-entry的列表。

module.exports = {

  overview: function(req, res) {
    var query = streamlog.find({ groupBy: ['created'], max: ['ogg'] });
    query.exec(function (err, matchingRecords) {
        res.ok(matchingRecords);
    });
  },

};

这只解决了问题的一部分,因为在使用上述groupBy时,只有几秒/分钟/小时不同的项目被认为是相同的。

我使用mongo,如果这可能有帮助

2 个答案:

答案 0 :(得分:1)

由于您需要的是mongo将返回的值的本地转换,因此没有明确的方法来执行您希望它执行的操作。

您可以使用query.native(),但这不允许您使用水线组。

您还可以在集合中创建另一个名为createdDate的列,此列将使用较短的日期格式进行更新,以便您可以执行聚合函数。

对于这种混淆感到抱歉,但简而言之,您无法对需要转换的值进行分组。你必须在之前/之后预先形成一些东西才能达到你想要的效果。

答案 1 :(得分:1)

通过mapReduce部分解决问题的方法

    overview: function(req, res) {
      streamlog.native(function(err, collection) {
        if (err) return res.serverError(err);

        collection.mapReduce(
          function() {
            // Indonesian dates are formatted as 16/03/1990
            var key = this.created.toLocaleDateString('id');
            emit(key, this);
          },
          function(k, v) {
            var biggest = {
              t: 0,
              v: {}
            };
            v.forEach(function(candidate) {
              if (candidate.ogg + candidate.mp3 > biggest.t) {
                biggest.t = candidate.ogg + candidate.mp3;
                biggest.v = candidate;
              }
            });
            return biggest.v;
          }, {
            out: "log_overview"
          },
          function(error, reduceCollection) {
            reduceCollection.find().toArray(function(a, b) {
              res.ok(b);
            });
          }
        );
      });
    },

由于这仍然是一种解决方法,我不会勾选我的答案,并且对于任何具有更好性能的答案感到高兴,然后:/