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 该如何正确取值,所以无论怎么查结果都不对。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
sanders
最佳答案

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

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

谈一些自己采坑的地方:

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

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

2年前 评论
讨论数量: 5

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

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

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

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

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

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

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

2年前 评论
sanders

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

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

谈一些自己采坑的地方:

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

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

2年前 评论

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