关联模型上的 Mongoid 2d 查询

Posted

技术标签:

【中文标题】关联模型上的 Mongoid 2d 查询【英文标题】:Mongoid 2d query on associated model 【发布时间】:2016-03-14 12:46:10 【问题描述】:

我有两个模型,LocationEvent

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 查询的主要内容,如果未能解决你的问题,请参考以下文章

从导轨mongoid中查询大量键

在 Mongo 的集合之间移动文档(通过 Mongoid)

mongoid 中的关联

Mongoid 嵌套关联不返回 Object

mongoid 中的 inverse_of 是啥意思?

heroku mongohq 和 mongoid Mongo::ConnectionFailure