我正在使用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"
)
);
答案 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);
}
}