如何在 Mongoid / MongoDB 中为 $within 查询选择单位

Posted

技术标签:

【中文标题】如何在 Mongoid / MongoDB 中为 $within 查询选择单位【英文标题】:How to select units for $within query in Mongoid / MongoDB 【发布时间】:2015-03-18 04:09:59 【问题描述】:

以下是我的查询,

db.places.save("location":[ 12.948430, 77.573868 ])
db.places.save("location":[ 12.947813, 77.573653 ])
db.places.ensureIndex(  "location" : "2d"  )
db.places.find( "location" :  $within :  $center : [[12.948430, 77.573868],0.00015]   )

在上面的查询中如何选择单位,是米还是公​​里? 如果我现在想做米,我正在做 0.00015 半径为 15 米,这是正确的吗?

【问题讨论】:

【参考方案1】:

您既没有使用米也没有使用公里。二维索引意味着您说您的数据在二维坐标系内。 .00015 在您的情况下表示 0.00015 度。在平面 2d 平面上(或在坐标足够接近的 2dsphere 索引上,误差幅度无关紧要),您可以按照 this 转换为 km。

如果您使用的实际坐标可能彼此之间有任何合理距离,我还建议您使用 2dsphere 索引而不是 2d 索引进行索引,因为如果 mongodb 认为世界,地球的曲率会搞砸它的计算是平的。

【讨论】:

【参考方案2】:

这是一个非常有趣的问题!我也一直在为此苦苦挣扎!很多谷歌搜索,但答案就在 MongoDB documentation。

从这里你可以了解到:

要使球形查询运算符正常工作,您必须将距离转换为弧度,并将弧度转换为应用程序使用的距离单位。

转换:

弧度的距离:将距离除以球体(例如地球)的半径,单位与距离测量值相同。 弧度到距离:将弧度测量值乘以球体(例如地球)的半径,以单位制将距离转换为。

地球的半径约为 3,959 英里或 6,371 公里。

我们如何使用它?试试这个:

db.places.find(  location:  $geoWithin:  $centerSphere: [ [ 12.948430, 77.573868 ] ,
                                                           100 / 6371 ]    )

请注意,我使用了这种技术,它适用于 MongoDB 2.6

希望有帮助!

祝你好运!

【讨论】:

以上是关于如何在 Mongoid / MongoDB 中为 $within 查询选择单位的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Mongoid 查看原始 mongoDB 查询

如何在 mongoid dsl 中编写 mongodb $near 查询?

如何实现has_many:通过与Mongoid和mongodb的关系?

如何使用 MongoDB 和 Mongoid 在 Rails 3 上进行适当的数据库测试 (TDD)

如何避免在 MongoDB(使用 Mongoid)或 ActiveRecord(使用 MySQL 的 Rails)中插入两次相同的记录?

批量查找 mongoDB 记录(使用 mongoid ruby​​ 适配器)