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 number在使用 PyMongo 时遇到了问题,并且交换顺序修复了它。

于 2012-04-27T08:42:12.383 回答
1

我猜这实际上是数据问题或索引问题,您的查询看起来正确。

请参阅http://www.mongodb.org/display/DOCS/Geospatial+Indexing ... MaxDistance 200 可能太大:

默认情况下,索引假定您正在索引经度/纬度,因此配置为 [-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 回答