【问题标题】:Finding distinct rows in scope with mongoid使用 mongoid 在范围内查找不同的行
【发布时间】:2012-08-06 10:22:36
【问题描述】:

我的 Rails 项目中有两个模型:persons 和一个嵌入式集合,Cities。还有一个关于城市的空间指数。我想找到一个城市附近的所有人。

class Person
 include Mongoid::Document
 include Mongoid::Timestamps
 embeds_many :cities
 scope :nearby, ->(location, distance) { where('cities.location' => 
                    {'$near' => location , '$maxDistance' => distance})}


class City
  include Mongoid::Document
  include Mongoid::Timestamps
  embedded_in :person
  field :city
  field :location, type: Array  #0: latitude, 1: longitude

location_in_new_york = [40.71892, -74.00131]

我的查询是

Person.nearby(location_in_new_york, 1)

但是这样做,一个拥有两个彼此非常接近的城市的人会被发现两次。我怎样才能避免这种行为?我不想在 ruby​​ 中减少这个,因为我想保持我的范围。

【问题讨论】:

    标签: ruby-on-rails mongodb mongoid


    【解决方案1】:

    虽然不如根据条件调用 .distinct 那样干净,但此解决方法给出了预期的结果:

    Person.find(Person.nearby(location_in_new_york, 1).distinct(:_id))
    

    但是,这不能(如所写)作为范围起作用,因此您必须将其设为类方法。就个人而言,我会考虑向 mongoid 添加一个补丁,以添加一个 .unique 方法来满足您的需求(因为当您使用其不同的运算符时,MongoDB 负责返回字段值而不是文档:http://www.mongodb.org/display/DOCS/Aggregation

    【讨论】:

    • 这行得通,非常感谢。问题是,find 方法的结果是一个数组而不是一个条件,它添加了一个订单条件,结果将被分页。两者都不适用于数组。我同意添加补丁似乎是最好的选择。
    • 一个人真的需要在您的数据模型中包含多个城市吗?那将是最容易改变的事情。否则,是的,这就是为什么我建议将其作为类方法进行,因为它不可链接。您可以在执行位置查询之前调用 order,并对数组进行分页(希望没有太多结果),或者执行“加载更多”而不是完整分页。
    • 不幸的是它需要多个城市。但是是的,除非我们找到更好的解决方案,否则我们将不使用它们。我还看到有一个 uniqueDocs 选项 (bit.ly/hrPjfS),但它不适用于附近的查询。
    猜你喜欢
    • 1970-01-01
    • 2014-03-31
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    相关资源
    最近更新 更多