如何对字符串数据(JSON)执行增量mapReduce?

时间:2016-07-06 22:42:44

标签: json string mongodb mapreduce

我正在使用MongoDB中的Geo-Spatial数据并尝试使用Incremental mapReduce从数据中查询。(我试图找到彼此相交的区域)

我的收藏包含以下原型的文档(bbox是经度和纬度):

{
"_id" : ObjectId("577be972e0977965a62e3264"),
"value" : {
    "Name" : "43456",
    "type" : "zip",
    "bbox" : [
        -82.856831,
        41.62814,
        -82.793069,
        41.724549
    ]
}
}

在我的mapreduce代码中我试图找到彼此相交的区域,为此我使用了“incremental mapReduce”。因此,我在reduce函数中定义了一个数组,我想把所有涉及拦截的区域放在这个数组中。 (在map函数中我将所有集合放在一个文件[emit(1,this.value)]中,以便使用嵌套for循环在其中进行搜索)。

当我在MongoDB中运行此代码时,reduce函数的输出为null。我猜测的是代码的增量部分可能是错误的,但我仍然不确定。另一方面,如果真的错了,我不知道如何解决它。

这是我的mapReduce代码:

var Mapper=function(){

var key=1;
var value={
id: this._id,
Name: this.value.Name,
Type: this.value.type,
Bbox: this.value.bbox
};
emit (key, value);
}
var Reducer=function(key, val){

var reduceObj={
id:0,
Name: 0,
Type: 0,
Bbox: 0};

for(var i=0; i<(val.lenght)-1; i++)
{ for(var j=1; j<val.lenght; j++)
{
if((val[i].Type=="zip") && (val[j].Type=="water")&&
(((val[i].Bbox[0]==val[j]. Bbox[0] ||  val[i].Bbox[0]== val[j].Bbox[2] ||          val[i].Bbox[2] == val[j].Bbox[0] || val[i].Bbox[2] == val[j].Bbox[2])||( val[i].Bbox[0] <= val[j].Bbox[0]  && val[i].Bbox[0] <= val[j].Bbox[2]) ||( val[i].Bbox[0] <= val[j].Bbox[0] && val[i].Bbox[0] <= val[j].Bbox[2]) )&&( (val[i].Bbox[1] == val[j].Bbox[1] ||  val[i].Bbox[1] == val[j].Bbox[3] || val[i].Bbox[3] == val[j].Bbox[1] || val[i].Bbox[3] == val[j].Bbox[3])||( val[i].Bbox[1] <= val[i].Bbox[1]  && val[i].Bbox[1] <= val[j].Bbox[3]) ||( val[i].Bbox[1] <= val[j].Bbox[1] && val[i].Bbox[1] <= val[j].Bbox[3]))))

{
reduceObj.id=val.id;
reduceObj.Name=val.Name;
reduceObj.Type=val.Type;
reduceObj.Bbox=val.Bbox;

}

}}
return reduceObj;
}
db.ALL.mapReduce(Mapper, Reducer, {
out: "Intersects"})

如果有人帮助我,我将非常感激

0 个答案:

没有答案