как сделать отчетливый и групповой в mongodb? - PullRequest
3 голосов
/ 03 июня 2011

как выполнить запрос mysql SELECT COUNT (DISTINCT ip), COUNT (область DISTINCT) FROM visit_logs GROUP BY t_hour в mongodb без многокарточного редукта?

1 Ответ

7 голосов
/ 03 июня 2011

Вы должны хранить список «ключей» в ваших объектах и ​​вычислять ваш счет как количество различных ключей;это можно сделать с помощью метода finalize в карте / уменьшении MongoDb.

Что-то вроде (не проверено):

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 };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...