我正在使用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"})
如果有人帮助我,我将非常感激