如何在mongodb中进行不同和分组?

发布于 2024-11-13 07:05:07 字数 127 浏览 1 评论 0原文

如何进行 mysql 查询 SELECT COUNT(DISTINCT ip), COUNT(DISTINCT area) FROM Visit_logs GROUP BY t_hour 在 mongodb 中没有多重 MapReduce?

how to do a mysql query
SELECT COUNT(DISTINCT ip), COUNT(DISTINCT area) FROM visit_logs GROUP BY t_hour
in mongodb without multi mapreduct?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

固执像三岁 2024-11-20 07:05:07

您必须在对象中保留“键”列表,并将您的计数计算为不同键的计数;这可以在 MongoDb 的 map/reduce 中的 finalize 方法中完成。

像(未经测试)的东西:

var mapFn = function() {
  emit(this.t_hour, { ips: [this.ip], areas: [this.area] );
};

var reduceFn = function(key, values) {
  var ret = { ips: {}, areas: {} };
  // objects used as "sets"
  var ips = {};
  var areas = {};

  values.forEach(function(value) {
    value.ips.forEach(function(ip) {
      if (!ips[ip]) {
        ips[ip] = true; // mark as seen
        ret.ips.push(ip);
      }
    });
    value.areas.forEach(function(area) {
      if (!areas[area]) {
        areas[area] = true; // mark as seen
        ret.areas.push(area);
      }
    });
  });
};

var finalizeFn = function(key, value) {
  return { ips: value.ips.length; areas: value.areas.length };
}

You have to keep the list of "keys" in your objects, and compute your count as the count of the distinct keys; this can be done in the finalize method in MongoDb's map/reduce.

Something like (untested):

var mapFn = function() {
  emit(this.t_hour, { ips: [this.ip], areas: [this.area] );
};

var reduceFn = function(key, values) {
  var ret = { ips: {}, areas: {} };
  // objects used as "sets"
  var ips = {};
  var areas = {};

  values.forEach(function(value) {
    value.ips.forEach(function(ip) {
      if (!ips[ip]) {
        ips[ip] = true; // mark as seen
        ret.ips.push(ip);
      }
    });
    value.areas.forEach(function(area) {
      if (!areas[area]) {
        areas[area] = true; // mark as seen
        ret.areas.push(area);
      }
    });
  });
};

var finalizeFn = function(key, value) {
  return { ips: value.ips.length; areas: value.areas.length };
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文