2
我已經從文檔中讀取了在MongoDB上聚合時不可能使用地理空間索引。有沒有其他的選擇?我試圖運行一個查詢,抓取特定半徑內的所有活動,然後根據活動發生的次數對它們進行分組/排序。有沒有解決這個問題的方法?MongoDB - 具有聚合的地理空間索引
我已經從文檔中讀取了在MongoDB上聚合時不可能使用地理空間索引。有沒有其他的選擇?我試圖運行一個查詢,抓取特定半徑內的所有活動,然後根據活動發生的次數對它們進行分組/排序。有沒有解決這個問題的方法?MongoDB - 具有聚合的地理空間索引
您可以在地理查詢中使用map-reduce。這是基於geo_mapreduce.js一個例子(從mongodb的jstests):
// 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)
}
你找到了答案,但以防萬一的piplining聚集我用這個:http://docs.mongodb.org/manual/reference /運營商/聚集/ geoNear / – Maziyar 2013-10-30 16:11:08