关联模型上的 Mongoid 2d 查询
Posted
技术标签:
【中文标题】关联模型上的 Mongoid 2d 查询【英文标题】:Mongoid 2d query on associated model 【发布时间】:2016-03-14 12:46:10 【问题描述】:我有两个模型,Location
和 Event
。
class Event
include Mongoid::Document
field :name, type: String
belongs_to :location
index('location.coordinates' => '2d', unique: true) # I added this later on because I had an error when querying on location.coordinates
end
class Location
include Mongoid::Document
field :coordinates, type: Array
index(coordinates: '2d', unique: true)
has_many :events
end
现在,如果我创建一个带有关联位置的 Event
Location.create(coordinates: [40.7127837, -74.0059413])
Event.create(name: "foo", location: Location.first)
如何查询特定位置附近的事件? 我试过这个:
Event.where('location.coordinates' => '$near' => [40.7127837, -74.0059413], '$maxDistance' => 1000.fdiv(111.12)).first
但它不返回任何结果,而
Location.where('coordinates' => '$near' => [40.7127837, -74.0059413], '$maxDistance' => 1000.fdiv(111.12)).first
返回之前创建的Location
对象。
我做错了什么?
【问题讨论】:
我没有使用过 ruby,请参阅此处了解如何使用 mongo docs.mongodb.org/manual/reference/operator/query/nearSphere 进行 nearSphere 查询。 $near 和 $nearSphere 是不同的。 maxDistance 应该以米为单位。 1000.fdiv(111.12) 是什么意思? 从here,1000.fdiv(111.12)
应该将公里转换为度(所以 1000 公里以度为单位)。我编辑了我的问题,事实上,如果我直接查询Location
模型,$near
就可以工作,所以我认为它与 mongoid 有更多关系......
度数还是弧度?对不起,我不熟悉 ruby 语法,但 mongo 不支持度值,它必须是弧度。 $nearSphere 算法将距离计算为球体,而 $near 仅计算为平面。对于地理位置计算,$nearSphere 将为您提供准确的结果。
【参考方案1】:
这对我来说似乎是一个急切的加载问题。你试过.includes(:location)
Event.includes(:location).where('location.coordinates' => '$near' => [40.7127837, -74.0059413], '$maxDistance' => 1000.fdiv(111.12)).first
我以前使用过 mongoid,但似乎无法确定是否需要它,以及它是哪个版本。在某些版本的所有模型上默认启用急切加载,并且需要设置配置文件身份映射中的旧版本,但在版本 4 中没有了。
【讨论】:
我用的是 Mongoid 5,我用includes
试过,但还是没有结果。以上是关于关联模型上的 Mongoid 2d 查询的主要内容,如果未能解决你的问题,请参考以下文章