0

我们在 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 } } }).sort({"user.lastActivity" :-1}).limit(100)

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

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

db.runCommand( { geoNear: "users", near: { type: "Point" , 坐标: [ 51.410608, 35.744042 ]},spherical: true , "limit": 100, "maxDistance": 2000 } )

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

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

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

我们还在 1394018 记录上找到了 mysql 的近点。执行时间为 0.0011。这一次真是太棒了。

选择 st_distance_sphere(fld_geom, point(35.744042,51.410608)) 作为与 testgeom 的距离,其中 st_distance_sphere(fld_geom, point(35.744042,51.410608))<=2000 限制 100

我认为 mysql spatial 比 mongodb spatial 非常强大。

4

2 回答 2

0

为了提高性能,为正在搜索的字段上的集合创建一个 2D 球体索引。

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

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

于 2017-05-08T01:09:43.920 回答
0

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

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

文档

于 2017-07-02T13:36:19.073 回答