2017-05-06 44 views
0

我们有一个问题,在mongodb数据库中用距离找到用户点附近的点。我们的主要问题是我们无法用近距离聚集近点。我们使用$ geoWithin下面查询:Mongodb在用户点附近找到点距离

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

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

我们也使用$ nearSphere下面的查询:

db.users.find({位置:{$ nearSphere:{$几何:{类型: “点”, 坐标:51.410608,35.744042 ]},$ maxDistance:2000}}} )排序({ “user.lastActivity”: - 1})限制(100)

该查询返回从500204个记录在8.486秒100分的记录。

我们还使用geoNear下面查询:

db.runCommand({geoNear: “用户”, 邻近:{类型: “点”,坐标:[51.410608,35.744042]}, 球形:true, “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,点(35.744042,51.410608)),如从testgeom 距离其中st_distance_sphere(fld_geom,点( 35.744042,51.410608))< = 2000 LIMIT 100

我想的MySQL空间比mongodb空间非常强大。

回答

0

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

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

还有其他类型的地理空间指标的为好。这应该大大提高内存利用率的性能。

+0

感谢。我们将添加2dsphere索引,但问题没有解决。性能不佳。 –

+0

然后考虑在不同的集合中保留不相关的数据,或者查看您的服务器规格。 – arboreal84

+0

感谢您的解决方案。我们可以在mysql上运行这个部分,但是我们不能这样做。 mysql对于这个操作确实有不错的表现。 –

0

$ nearSphere会给出按距离排序的结果,而$ getWithin则不会。 我不认为SQL查询按照距离的文件(只是过滤它们像$ geoWithin)

  • 无厘头使用排序上user.lastActivity与$ nearSphere - 你只覆盖从你的距离排序$ nearSphere。

documentation

相关问题