2013-02-19 7 views
2

togoes에서 MongoDB와의 집계에 지형 공간 인덱스를 사용할 수 없음을 읽었습니다. 이것에 대한 대안이 있습니까? 쿼리를 실행하려고하면 특정 반경 내에서 모든 활동을 가져온 다음 활동이 발생한 횟수만큼 그룹화/정렬합니다. 이 문제를 해결할 방법이 있습니까?집계가있는 MongoDB - Geospatial 인덱스

+0

당신은 답을 찾았지만 단지 piplining 통합을위한 경우에 내가 이것을 사용 : 여기합니다 (MongoDB를의 jstests에서) geo_mapreduce.js에 따라 예입니다 http://docs.mongodb.org/manual/reference/연산자/집계/geoNear / – Maziyar

답변

2

geo 쿼리에서 map-reduce를 사용할 수 있습니다.

// setup test collection 
var act_date = new Date(2010,06,07); 
for (i = 1; i <= 10; i++) { 
    db.activity.insert({ "geo" : { "lat" : 32.68331909, "long" : 69.41610718 }, "date":act_date, "activity" : 9 * i }); 
    db.activity.insert({ "geo" : { "lat" : 35.01860809, "long" : 70.92027283 }, "date":act_date, "activity" : 3 }); 
    db.activity.insert({ "geo" : { "lat" : 31.11639023, "long" : 64.19970703 }, "date":act_date, "activity" : 11 }); 
    db.activity.insert({ "geo" : { "lat" : 32.64500046, "long" : 69.36251068 }, "date":act_date, "activity" : 9 }); 
    db.activity.insert({ "geo" : { "lat" : 33.23638916, "long" : 69.81360626 }, "date":act_date, "activity" : 22 }); 
    act_date.setDate(act_date.getDate() + 1); 
} 

db.activity.ensureIndex({ "geo" : "2d" }); 
center = [ 32.68, 69.41 ]; 
radius = 10/111; // 10km; 1 arcdegree ~= 111km 
geo_query = { geo : { '$within' : { '$center' : [ center, radius ] } } }; 

// map function 
m = function() { 
    emit(this.date, { "activity" : this.activity }); 
}; 

// reduce function 
r = function(key, values) { 
    var total = 0; 
    for (var i = 0; i < values.length; i++) { 
     total += values[i].activity; 
    } 
    return {"activity":total }; 
}; 

// mapreduce with geo query 
res = db.activity.mapReduce(m, r, { out : { inline : 1 }, query : geo_query }); 
// sort results 
res.results.sort(function(a, b){return b.value.activity - a.value.activity}) 
for (var i=0; i < res.results.length; i++) { 
    print("Date: " + res.results[i]._id + " Activity: " 
         + res.results[i].value.activity) 
} 
관련 문제