gpt4 book ai didi

MongoDB - 带聚合的地理空间索引

转载 作者:可可西里 更新时间:2023-11-01 10:33:35 25 4
gpt4 key购买 nike

我从文档中了解到,不可能在 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)
}

关于MongoDB - 带聚合的地理空间索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14965826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com