2012-02-10 1 views
0

私はCodeigniterとMongoDBを使ってWebアプリケーションを開発しています。 私はmap reduceを働かせようとしています。マップを減らしてタグをカウントする

私は以下の構造のファイル文書を入手しました。私はマップを に減らして、各タグが何回使用されているかをチェックし、それをコレクションfiles.tagsに出力したいと考えています。

{ 
    "_id": { 
     "$id": "4f26f21f09ab66c1030d0000e" 
    }, 
    "basic": { 
     "name": "The filename" 
    }, 
    "tags": [ 
     "lorry", 
     "house", 
     "car", 
     "bicycle" 
    ], 
    "updated_at": "2012-02-09 11:08:03" 
} 

私は、このマップは、コマンドを削減しようとしたが、それは、個々のタグはカウントされません。

$map = new MongoCode ("function() { 

emit({tags: this.tags}, {count: 1}); 

}"); 

    $reduce = new MongoCode ("function(key , values) { 

    var count = 0; 

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

    return {count: count}; 

    }"); 

    $this->mongo_db->command (array (

    "mapreduce" => "files", 
    "map"  => $map, 
    "reduce" => $reduce, 
    "out"  => "files.tags" 

    ) 

    ); 

答えて

1

いや、このマップ/単にタグの合計数を計算減らします。

mongodb料理の本there is exampleで探しています。あなたが代わりにタグのコレクション全体の各タグを放出する必要が

map = function() { 
    if (!this.tags) { 
     return; 
    } 

    for (index in this.tags) { 
     emit(this.tags[index], 1); 
    } 
} 
+0

うまく働いた!現在、files.tagsの各ドキュメントは、タグ名から_idを取得します。私は各文書に通常のMongoIdを与えて、タグを追加したいと思います。代わりに、各文書に 'theタグ'を追加します。どうやってやるの? –

+0

@JonathanClark:私の練習マップから、減速は常に遅く、私はそれを避けようとしています。または、実際に非同期処理をバックグラウンドに移動する必要がある場合や、[インクリメンタル](http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-MongoShellScriptwithIncrementalMapReduceandFinalize)マップ/リダクションを使用すると、フル情報元。だから、一般的にはmap/reduceはリアルタイム計算には受け入れられません。特に大量のデータではそうです。 –

+0

ええ、それは悲しいです。 _idをタグ名に設定するのではなく、通常のMongoIdsを使う方法を知っていますか?代わりにドキュメントにタグ名を追加しますか? –

1

をあなたは、入力文書の各タグに一度EMITを呼び出す必要があります。例えば

のMongoDBドキュメントは言う:

マップ関数呼び出しは、減速機にデータを供給する(キー、値)倍の任意 数を発します。ほとんどの場合、入力文書ごとに が1回発行されますが、タグをカウントするなどの場合には、 の文書に1つ、多くの、またはゼロのタグが含まれることがあります。

+0

私はそれぞれの5個のタグをファイルコレクションに1.000.000文書を持っている場合には、速さ、まだ減らし、地図のだろうか? –

+0

それはおそらく私が信じる約10分かかります。あなたは何をクイックとして定義しますか? – ggreiner

+0

ああ。私はちょうどそれのための感じを得たかった。おそらく、ユーザーが新しいファイル文書を作成するときに、タグ数を更新するほうがよいでしょうか? –

1
はあなたに地図機能を変更

function map(){ 
    if(!this.tags) return; 
    this.tags.forEach(function(tag){ 
     emit(tag, {count: 1}); 
    }); 
} 
関連する問題