MongoMapper附近有maxDistance - Mongo :: OperationFailure:geo值必须是数字:

时间:2012-04-04 23:36:10

标签: mongodb geospatial mongomapper

我正在尝试在MongoMapper支持的模型中使用maxDistance封装near查询。

我必须在查询语法中做些傻事。

模型

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 个答案:

答案 0 :(得分:12)

您可能已遇到this bug,需要$near$maxDistance首先与$maxDistance订购。

在任何情况下,我都发现了这个问题,因为我在使用PyMongo时得到OperationFailure: database error: geo values have to be number,并且交换订单修复它。

答案 1 :(得分: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
  }
}

答案 2 :(得分:1)

这是另一个解决方案for this one

{'location' : SON([('$near', [55.55632, 25.13522]), ('$maxDistance', 0.01)])})

答案 3 :(得分:0)

在会话中存储的数据出现此错误(不同的比赛,php + zf2):一个floatval(lat),floatval(lon)解决了问题:) 我发布它以防有人需要它:)