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.server機能のmap放出ではちょうどする必要があります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 に答える