0

Rails プロジェクトには 2 つのモデルがあります。人と埋め込みコレクションの都市です。都市には空間インデックスもあります。ある都市の近くにいるすべての人を見つけたいです。

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)

しかし、そうすると、互いに非常に近い 2 つの都市を持つ人が 2 回見つかります。この動作を回避するにはどうすればよいですか? スコープを維持したいので、これをルビーで減らしたくありません。

4

1 に答える 1

1

.distinct基準を呼び出すことができるほどきれいではありませんが、この回避策により、期待される結果が得られます。

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

ただし、これは (書かれているように) スコープとしては機能しないため、クラス メソッドにする必要があります。個人的には、mongoid にパッチを追加して、必要な処理を行う.uniqueメソッドを追加することを検討します (MongoDB は、個別の演算子を使用する場合にドキュメントの代わりにフィールド値を返す責任があるためです: http://www.mongodb.org/display /DOCS/アグリゲーション)

于 2012-08-06T11:40:50.280 に答える