【问题标题】:how to write mongodb $near query in mongoid dsl?如何在 mongoid dsl 中编写 mongodb $near 查询?
【发布时间】:2015-01-06 10:25:50
【问题描述】:

我有这个 mongodb 查询,如果可能的话,我想用 mongoid dsl 编写它

    db.pokemons.find(
       {
         target_region :
           { $near :
              {
                $geometry: { type: "Point",  coordinates: [-80.190262, 25.774252] },
                $minDistance: 1110,
                $maxDistance: 5000
              }
           }
       }
    )

【问题讨论】:

标签: ruby-on-rails geolocation mongoid geospatial


【解决方案1】:

假设您通过 params[:coordinates] 获取坐标

clocation = params[:coordinates].split(",").map(&:to_f)
max_distance = params[:max_distance].to_i 
min_distance = params[:min_distance].to_i 

如果您想通过 point 进行测量,请使用此

Pokemon.where(:target_region => {"$near" => clocation , '$maxDistance' => max_distance, '$minDistance' => min_distance})

如果您想通过 miles 进行测量,请使用此

Pokemon.where(:target_region => {"$near" => clocation , '$maxDistance' => max_distance.fdiv(69), '$minDistance' => min_distance.fdiv(69)})

如果您想通过 kilometers 进行测量,请使用此

Pokemon.where(:target_region => {"$near" => clocation , '$maxDistance' => max_distance.fdiv(111.12), '$minDistance' => min_distance.fdiv(111.12)})

【讨论】:

  • 不工作@skip=0 @limit=0 @selector={"target_region"=>{"$near"=>[-80.190262, 25.774252], "$maxDistance"=>5000000, :isNearSphere=>true}} @fields=nil> failed with error 17007: "Unable to execute query: error processing query: ns=mobadz_development.campaigns limit=0 skip=0\nTree: GEONEAR field=target_region maxdist=5e+006 isNearSphere=0\nSort: {}\nProj: {}\n planner returned error: unable to find index for $geoNear query" See https://github.com/mongodb/mongo/blob/master/docs/errors.md for details about this error.
  • 不适合我。它给了我上述错误Pokemon.where(:target_region => {"$near" => clocation , '$maxDistance' => 5000000}) 我确实在 :target_region 字段上创建了索引db.campaigns.ensureIndex({target_region : "2dsphere"})
  • 你在Pokemon模型中使用了index({target_region: "2d"})吗?
  • 你的字段也应该这样声明。 field :target_region, type: Array, :default => [] # [lat,lng]
  • 是的,我也试过“2d”索引。我的字段是geoJSON,声明为field :target_region, type: hash # {type:"Polygon", coordinates: [[ [log,lat], [long,lat] ] ]
【解决方案2】:

我认为你应该使用

Pokemon.geo_near([-80.190262, 25.774252]).min_distance(1110).max_distance(5000)

还可以查看 The mongoid docs 以供参考 http://mongoid.org/en/mongoid/docs/querying.html#geo_near

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多