4

MongoMapper に基づくモデルで、maxDistance を使用してニア クエリをカプセル化しようとしています。

クエリ構文でばかげたことをしているに違いありません。

モデル

class Site
  include MongoMapper::Document

  key :id, Integer 
  key :name, String
  key :location, Array
  ensure_index [[:location, '2d']]


  def self.nearest(center_point, range)
    where(:location => {'$near' => center_point, '$maxDistance' => range}).all
  end

end

ポイントから 200 マイル以内にすべてを収めようとしています...

Site.nearest([-122.0,44.0],200)

> Mongo::OperationFailure: geo values have to be numbers: {
> $maxDistance: 200, $near: [ -122.0, 44.0 ] }  from
> /Library/Ruby/Gems/1.8/gems/mongo-1.6.1/lib/mongo/cursor.rb:144:in
> `next'    from
> /Library/Ruby/Gems/1.8/gems/mongo-1.6.1/lib/mongo/cursor.rb:290:in
> `each'    from
> /Library/Ruby/Gems/1.8/gems/mongo-1.6.1/lib/mongo/cursor.rb:308:in
> `to_a'    from
> /Library/Ruby/Gems/1.8/gems/mongo-1.6.1/lib/mongo/cursor.rb:308:in
> `to_a'    from
> /Library/Ruby/Gems/1.8/gems/plucky-0.4.4/lib/plucky/query.rb:74:in
> `all'     from /Users/nick/Code/web/map/app/models/site.rb:40:in
> `nearest'     from (irb):
4

4 に答える 4

12

最初に注文する必要があるこのバグに遭遇した可能性があります。$near$maxDistance$maxDistance

いずれにせよ、OperationFailure: database error: geo values have to be numberPyMongo を使用しているときにこの質問が表示され、順序を入れ替えることで解決したため、この質問を見つけました。

于 2012-04-27T08:42:12.383 に答える
1

実際にはデータの問題かインデックスの問題だと思いますが、クエリは正しいようです。

http://www.mongodb.org/display/DOCS/Geospatial+Indexingを参照してください... 200 の MaxDistance は大きすぎる可能性があります:

デフォルトでは、インデックスは経度/緯度にインデックスを付けていると想定しているため、[-180..180) の値の範囲に設定されています。

距離の単位は座標系と同じです。

またSite.distinct(:location)、数値以外のデータを探してみてください。(またはSite.query.distinct(:location)、MM 0.11.1 を使用していない場合)。

ヒント: MongoDB にヒットしたときにクエリがどのように表示されるかを確認したい場合は、次を追加し.criteria.to_hashます。

Site.where(:location => {'$near' => center_point, '$maxDistance' => range}).criteria.to_hash
# =>
{
  :location=> {
    "$near"        => [-122.0, 44.0],
    "$maxDistance" => 200
  }
}
于 2012-04-05T16:09:22.220 に答える
1

これに対する別の解決策は次のとおりです

{'location' : SON([('$near', [55.55632, 25.13522]), ('$maxDistance', 0.01)])})
于 2012-08-09T07:35:52.697 に答える
0

セッションに保存されたデータでこのエラーが発生しました(別のコンテスト、php + zf2):floatval(lat)、floatval(lon)が問題を解決しました:)誰かがそれを必要とする場合に備えて投稿しています:)

于 2014-05-06T20:42:05.837 に答える