mongodb中按地理位置聚合怎么做?
动机
最近有个需求要按照地理位置统计某个点周围一定半径内的销售额,最早使用 MySQL 来进行查询。由于数据量较大,经常能把 CPU 跑满。现在尝试换用 MongoDB 并使用索引进行优化查询。
问题
目前有两个问题:
- 在使用 geoNear 进行聚合查询的时候,maxDistance 应该如何取值?
- 我目前使用 jenssegers/mongodb 查询的时候如何使用 geoNear 做聚合查询?
目前的尝试
- 采用 Laravel 进行 geo 聚合查询的时候一直提示:
$geoNear, $near, and $nearSphere are not allowed in this context - 目前采用查询
db.order_positions.aggregate([{'$geoNear':{'near':[21.466359, 31.2226934],"distanceField":"location","maxDistance":1.25,'spherical':true}},{$group: {_id : "1", sum_amount : {$sum : 1}}}])但由于不知道 maxDistance 该如何正确取值,所以无论怎么查结果都不对。
关于 LearnKu
基本上搞定了,由于 MongoDB 做数据统计使用,为了控制每张表的数据量还需要分表,总体上不太适合按照模型的方式进行查询,最终采用的方案是自己去按照他的管道进行封装。
对于基于位置的统计最终采用 GeoJSON 格式搞定了,用了之后,maxDistance 的单位就是米了。以后需求还会加入按照多边形进行查询统计,貌似 GeoJSON 也是支持的。
谈一些自己采坑的地方:
一开始不知道怎么将字段传入位置查询条件,后来才知道,由于一个集合的位置索引只能有一个字段,所以不用传这个字段名。
一开始也不熟悉 MongoDB 的查询方式和聚合方式,费了很多时间,一些教程是基于早期版本做的,现在已经有诸如:union 和 count 之类的聚合管道了,非常好用。