1

问题是:

考虑以下位置:[-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 中,我只需按“州”进行分组,我怎么能在这里做到这一点,同时还要计算所有城市和总人口?

4

2 回答 2

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
}
于 2013-05-05T12:24:58.627 回答
0

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]}})
于 2014-12-09T09:44:59.407 回答