如何在 mongoid dsl 中编写 mongodb $near 查询?

Posted

技术标签:

【中文标题】如何在 mongoid dsl 中编写 mongodb $near 查询?【英文标题】:how to write mongodb $near query in mongoid dsl? 【发布时间】: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
              
           
       
    )

【问题讨论】:

你可能想探索mongoid.org/en/mongoid/v3/querying.html#geo_near 【参考方案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

【讨论】:

以上是关于如何在 mongoid dsl 中编写 mongodb $near 查询?的主要内容,如果未能解决你的问题,请参考以下文章

heroku mongohq 和 mongoid Mongo::ConnectionFailure

从导轨mongoid中查询大量键

如何在 Mongoid & Rails 中使用数组字段?

Mongoid:未初始化的常量(NameError)

Mongoid 在 ruby​​ 1.9.3 上失败

使用 Mongoid 批量插入/更新?