mongoid是mongoldb的ruby版本driver。
最近使用mongoid时发现文档不太详细,使用2d索引时查询源码才找到一些方法的用法,分享一下。
2d索引是对于经度和纬度建立索引,mongodb内部做了一些处理,可以方便的进行查询。
mongoldb对于2d索引的介绍:
https://docs.mongodb.org/manual/core/2d/
mongoid的官方文档:
https://docs.mongodb.org/ecosystem/tutorial/mongoid-indexes/
2d索引的建立方式:
class Person
include Mongoid::Document
field :location, type: Array
index({ location: "2d" }, { min: -200, max: 200 })
end
注意对于要建立2d索引的字段,需要定义为Array类型。
建立2d索引后,需要进行相关查询,比如查询距离坐标[0, 0]在10km之内的所有数据,这时发现mongoid的官方文档中并没有介绍。
而mongoldb的文档中介绍了 geoNear等方法,于是,在ruby项目中用mongoid的class的所有方法中查找到含 geo 关键字的方法,发现有个 geo_near 方法,然后下载了mongoid的源码,找到了其定义和用法如下。然后发现用起来其实很简单~~
代码位置:
lib/mongoid/contextual/mongo.rb
# Execute a $geoNear command against the database.
#
# @example Find documents close to 10, 10.
# context.geo_near([ 10, 10 ])
#
# @example Find with spherical distance.
# context.geo_near([ 10, 10 ]).spherical
#
# @example Find with a max distance.
# context.geo_near([ 10, 10 ]).max_distance(0.5)
#
# @example Provide a distance multiplier.
# context.geo_near([ 10, 10 ]).distance_multiplier(1133)
#
# @param [ Array<Float> ] coordinates The coordinates.
#
# @return [ GeoNear ] The GeoNear command.
#
# @since 3.1.0
def geo_near(coordinates)
GeoNear.new(collection, criteria, coordinates)
end