0

我有以下布局:

{
    "URL": "http://someurl.de",
    "plugins": {
        "HTTPServer": {
            "os": [
                "FreeBSD"
            ],
            "string": [
                "Apache/2.2.21 (FreeBSD) mod_ssl/2.2.21 OpenSSL/0.9.8q DAV/2 PHP/5.3.8 with Suhosin-Patch"
            ]
        }
    }
}

我想从中获取存储在 plugins.HTTPServer.string 中的唯一项目的计数。然而,所有 MapReduce 示例都仅引用单级文档。据我了解这些示例,您必须在 map 函数中发出数据(或选择要提取的数据),然后使用 reduce 进一步处理结果。我认为我的问题是在映射阶段 - 我需要访问上面的字符串值:“Apache/2.2 ...”

由于我只在 MongoDB 中度过了最后一天,如果我没有在这里提出正确的问题,请原谅我的无知。我是否朝着正确的方向前进?我知道我可以使用 distinct = db.coll.distinct('plugins.HTTPServer.string'),但我想用 MapReduce 来完成。

map = function() {
  server = this.plugins.HTTPServer.string
  emit({server : this.server}, {count: 1});
}

reduce = "function(key, values) {
  var count = 0;

  values.forEach(function(v) {
    count += v['count'];
  });

  return {count: count};
}"
4

1 回答 1

1

你有几个问题:

  1. this.servermap函数的发射中应该只是server
  2. 在您的文档中,该"string"字段是一个数组,而不是单个字符串,因此您将数组作为您的键发出,这可能不是您想要的。
  3. 你的函数"中有杂散字符。reduce

试试这个:

var map = function() {
  if (this.plugins && this.plugins.HTTPServer && this.plugins.HTTPServer.string) {
    this.plugins.HTTPServer.string.forEach(function(server) {
      emit({server: server}, {count: 1});
    });
  }
}

var reduce = function(key, values) {
  var count = 0;

  values.forEach(function(v) {
    count += v['count'];
  });

  return {count: count};
}
于 2012-12-04T01:22:44.773 回答