MongoDB GeoNear 聚合
Posted
技术标签:
【中文标题】MongoDB GeoNear 聚合【英文标题】:MongoDB GeoNear Aggregate 【发布时间】:2013-04-29 01:21:46 【问题描述】:问题是:
考虑以下位置:[-72, 42] 和围绕该点的半径为 2 的范围(圆)。编写查询以查找与此范围(圆圈)相交的所有状态。然后,您应该返回每个州的总人口和城市数量。根据城市数量对各州进行排名。
到目前为止我已经写了这个:
db.zips.find(loc: $near: [-72, 42], $maxDistance: 2)
的示例输出是: "city" : "WOODSTOCK", "loc" : [ -72.004027, 41.960218 ], "pop" : 5698, "state" : "CT", "_id" : "06281"
在 SQL 中,我只需按“州”进行分组,我怎么能在这里做到这一点,同时还要计算所有城市和总人口?
【问题讨论】:
我认为按状态分组来做所有你想在 SQL 或 MongoDB 中做的事情是不够的。但是 find 是如何做到你想要的呢?您想要与此范围相交的所有州 - 这不是您在这里找到的 - 您正在寻找该半径内的所有 城市。这就是你想要的吗? 【参考方案1】:假设您按照 mongoimport 例程获取其邮政编码数据(我将我的放入名为 zips7 的集合中):
mongoimport --db mydb --collection zips7 --type json --file c:\users\drew\downloads\zips.json
或
mongoimport --db mydb --collection zips7 --type json --file /data/playdata/zips.json
(取决于您的操作系统和路径)
然后
db.zips7.ensureIndex(loc:"2d")
db.zips7.find(loc: $near: [-72, 42], $maxDistance: 2).forEach(function(doc)
db.zips8.insert(doc);
);
请注意,db.zips7.stats() 显示为 30k 行,而 zips8 有 100 行
db.zips8.aggregate( $group :
_id : "$state",
totalPop : $sum : "$pop" ,
town_count:$sum:1
)
"result" : [
"_id" : "RI",
"totalPop" : 39102,
"town_count" : 10
,
"_id" : "MA",
"totalPop" : 469583,
"town_count" : 56
,
"_id" : "CT",
"totalPop" : 182617,
"town_count" : 34
],
"ok" : 1
【讨论】:
【参考方案2】:mongoid 中的语法
Zips.where(:loc => "$within" => "$centerSphere"=> [[lng.to_f,lat.to_f],miles.to_f/3959])
例子:
Zips.where(:loc => "$within" => "$centerSphere"=> [[-122.4198185,37.7750454],2.0/3959])
【讨论】:
以上是关于MongoDB GeoNear 聚合的主要内容,如果未能解决你的问题,请参考以下文章