我正在尝试在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):
答案 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)解决了问题:) 我发布它以防有人需要它:)