将地图缩减为计数标签

时间:2012-02-10 08:33:21

标签: codeigniter mongodb

我正在使用Codeigniter和MongoDB开发一个Web应用程序。 我试图让地图缩小工作。

我得到了一个具有以下结构的文件。我想做一张地图缩小到 检查每个标签的使用次数,并将其输出到集合files.tags。

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

我尝试了这个map reduce命令,但它不计算每个标记:

$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"

    )

    );

3 个答案:

答案 0 :(得分:2)

将地图功能更改为:

function map(){
  if(!this.tags) return;
  this.tags.forEach(function(tag){
      emit(tag, {count: 1});
  });
}

答案 1 :(得分:1)

您需要为输入文档中的每个标记调用一次。

例如,

MongoDB文档说:

  

map函数调用emit(key,value)any   将数据提供给reducer的次数。在大多数情况下,你会   每个输入文档发出一次,但在某些情况下,如计数标签,   给定的文档可能有一个,多个甚至零标签。

答案 2 :(得分:1)

是的,这张地图/简化只是计算标签的总数。

你正在寻找的mongodb食谱there is example

您必须发出每个标记而不是整个标记集合:

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

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