mongodb中按地理位置聚合怎么做?

动机

最近有个需求要按照地理位置统计某个点周围一定半径内的销售额,最早使用 MySQL 来进行查询。由于数据量较大,经常能把 CPU 跑满。现在尝试换用 MongoDB 并使用索引进行优化查询。

问题

目前有两个问题:

  1. 在使用 geoNear 进行聚合查询的时候,maxDistance 应该如何取值?
  2. 我目前使用 jenssegers/mongodb 查询的时候如何使用 geoNear 做聚合查询?

目前的尝试

  1. 采用 Laravel 进行 geo 聚合查询的时候一直提示:$geoNear, $near, and $nearSphere are not allowed in this context
  2. 目前采用查询 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 该如何正确取值,所以无论怎么查结果都不对。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
sanders
最佳答案

基本上搞定了,由于 MongoDB 做数据统计使用,为了控制每张表的数据量还需要分表,总体上不太适合按照模型的方式进行查询,最终采用的方案是自己去按照他的管道进行封装。

对于基于位置的统计最终采用 GeoJSON 格式搞定了,用了之后,maxDistance 的单位就是米了。以后需求还会加入按照多边形进行查询统计,貌似 GeoJSON 也是支持的。

谈一些自己采坑的地方:

一开始不知道怎么将字段传入位置查询条件,后来才知道,由于一个集合的位置索引只能有一个字段,所以不用传这个字段名。

一开始也不熟悉 MongoDB 的查询方式和聚合方式,费了很多时间,一些教程是基于早期版本做的,现在已经有诸如:union 和 count 之类的聚合管道了,非常好用。

3年前 评论
讨论数量: 5

用 Redis 的话,可以吗?Redis计算经纬度简单应用

3年前 评论
sanders (楼主) 3年前

顺带借楼问一下:MongoDB 楼主用的哪个包?

3年前 评论
sanders (楼主) 3年前

哥们mongoDB没你想的那么神奇,功能比mysql弱多了,压根完成不了这个功能。你可以为mysql弄几个主从数据库,因为圆可以分成两份(两个半圆),或四份。分别给几个主从数据库发送请求,把每份圆区域的结果返回给php,再由php进行最后加工。

3年前 评论
sanders (楼主) 3年前

2d和2dsphere索引,分别是针对平面和球面。docs.mongodb.com/manual/tutorial/b...

3年前 评论
sanders

基本上搞定了,由于 MongoDB 做数据统计使用,为了控制每张表的数据量还需要分表,总体上不太适合按照模型的方式进行查询,最终采用的方案是自己去按照他的管道进行封装。

对于基于位置的统计最终采用 GeoJSON 格式搞定了,用了之后,maxDistance 的单位就是米了。以后需求还会加入按照多边形进行查询统计,貌似 GeoJSON 也是支持的。

谈一些自己采坑的地方:

一开始不知道怎么将字段传入位置查询条件,后来才知道,由于一个集合的位置索引只能有一个字段,所以不用传这个字段名。

一开始也不熟悉 MongoDB 的查询方式和聚合方式,费了很多时间,一些教程是基于早期版本做的,现在已经有诸如:union 和 count 之类的聚合管道了,非常好用。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!