我有一个像这样的模型,我存储协调和地址。该模型仅用于测试。
class Geomodel
include Mongoid::Document
include Geocoder::Model::Mongoid
field :coordinates, type: Array
field :address
before_save :update_coordinates
def update_coordinates
self.address = Geocoder.search(self.coordinates).first.address
end
reverse_geocoded_by :coordinates
after_validation :reverse_geocode # auto-fetch address
end
我能够存储坐标和地址。但我无法使用
obj = Geomodel.near(坐标:[xx,xx])。
它显示了一些Mongo标准,如下所示。
#Mongoid::Criteria
selector: {"coordinates"=>{"$near"=>[xx, xx]}}
options: {}
class: Geomodel
embedded: false>
当我将对象转换为数组进行测试时,它也会显示此错误。 obj.to_a
Moped::Errors::QueryFailure: The operation: #<Moped::Protocol::Query
@length=114
@request_id=18
@response_to=0
@op_code=2004
@flags=[]
@full_collection_name="staging_development.geomodels"
@skip=0
@limit=0
@selector={"coordinates"=>{"$near"=>[73.8719, 18.6139]}}
@fields=nil>
failed with error 13038: "can't find any special indices: 2d (needs index), 2dsphere (needs index), for: { coordinates: { $near: [ 73.8719, 18.6139 ] } }"
请帮助我如何解决问题或提供有关使用地理编码器查询的最佳教程的链接。 我使用的是RAILS 4和MONGOID gem。
PS:我认为这整个错误是由于以下原因造成的
1.创造范围:近。覆盖现有方法Geomodel.near。
2.可能是由于2dsphere索引。
答案 0 :(得分:0)
Re:obj = Geomodel.near(坐标:[xx,xx])
这是一个Mongoid :: Criteria&#34;查询&#34;并且不记录查询的结果。 您必须使用#to_a之类的方法对其进行迭代,以便将查询发布到MongoDB服务器并作为结果返回文档。
是的,不要定义自己的范围:靠近它会覆盖现有的Geomodel#near。
如错误诊断中所述,地理空间$ near查询需要2dsphere索引,请参阅http://docs.mongodb.org/manual/reference/operator/query/near/