私は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"
)
);
うまく働いた!現在、files.tagsの各ドキュメントは、タグ名から_idを取得します。私は各文書に通常のMongoIdを与えて、タグを追加したいと思います。代わりに、各文書に 'theタグ'を追加します。どうやってやるの? –
@JonathanClark:私の練習マップから、減速は常に遅く、私はそれを避けようとしています。または、実際に非同期処理をバックグラウンドに移動する必要がある場合や、[インクリメンタル](http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-MongoShellScriptwithIncrementalMapReduceandFinalize)マップ/リダクションを使用すると、フル情報元。だから、一般的にはmap/reduceはリアルタイム計算には受け入れられません。特に大量のデータではそうです。 –
ええ、それは悲しいです。 _idをタグ名に設定するのではなく、通常のMongoIdsを使う方法を知っていますか?代わりにドキュメントにタグ名を追加しますか? –