Mongodb发现附近的用户指向距离

时间:2017-05-06 17:02:11

标签: mongodb gis 2dsphere

我们遇到一个问题,就是在mongodb数据库中找到距离用户点距离。我们的主要问题是我们不能用距离聚集近点。我们在下面的查询中使用了$ geoWithin:

  

db.users.find({location:{$ geoWithin:         {$ centerSphere:[[51.410608,35.744042],2 / 6378.1]}}})。sort({“user.lastActivity”: - 1})。limit(100)

此查询从0.005秒内的500204条记录中返回100条记录。

我们还在下面的查询中使用$ nearSphere:

  

db.users.find({location:{$ nearSphere:{$ geometry:{type:“Point”,   坐标:[51.410608,35.744042]},$ maxDistance:2000}}   })排序({ “user.lastActivity”: - 1})极限(100)

此查询从8.486秒的500204条记录中返回100条记录。

我们还使用geoNear和以下查询:

  

db.runCommand({geoNear:“users”,                      附近:{type:“Point”,坐标:[51.410608,35.744042]},                      球形的:是的,                      “limit”:100,“maxDistance”:2000})

此查询从6.215秒的500204条记录中返回100条记录。此查询找到距离近点,但执行需要很长时间。

我们在users.locations字段中添加索引2dsphere。

1)请告诉我为什么$ nearSphere执行时间超过$ nearSphere? 2)如何用$ nearSphere找到近点并计算返回记录距离? 3)如何用更少的时间执行geoNear?

我们也在1394018记录中发现了与mysql的近点。执行时间是0.0011。这一次非常棒。

  

SELECT st_distance_sphere(fld_geom,point(35.744042,51.410608))as   距testgeom的距离st_distance_sphere(fld_geom,point(   35.744042,51.410608))< = 2000 LIMIT 100

我认为mysql空间比mongodb空间非常强大。

2 个答案:

答案 0 :(得分:0)

要提高性能,请在搜索字段上为集合创建2D球体索引。

https://docs.mongodb.com/manual/core/2dsphere/#create-a-2dsphere-index

还有其他类型的地理空间索引。这应该以内存利用为代价大幅提高性能。

答案 1 :(得分:0)

$ nearSphere为您提供按距离排序的结果,而$ getWithin则不是。 我不认为sql查询按距离对文档进行排序(只是像$ geoWithin一样过滤它们)

  • 使用$ nearSphere对user.lastActivity进行排序没有意义 - 你只需覆盖$ nearSphere的距离排序。

来自documentation