Class: Mongoid::Criterion::NearSpacial

Inherits:
Complex
  • Object
show all
Defined in:
lib/mongoid_spacial/criterion/near_spacial.rb

Overview

NearSpecial criterion is used when performing #near with symbols to get get a shorthand syntax for where clauses.

Examples:

Coninputersion of a simple to complex criterion.

{ :field => { "$nearSphere" => => [20,30]}, '$maxDistance' => 5 }
becomes:
{ :field.near(:sphere) => {:point => [20,30], :max => 5, :unit => :km} }

Instance Method Summary collapse

Instance Method Details

#to_mongo_query(input) ⇒ Object

Coninputert input to query for near or nearSphere

Examples:

near = NearSpacial.new(:key => :field, :operator => "near")
near.to_mongo_query({:point => [:50,50], :max => 5, :unit => :km}) => { '$near : [50,50]' , '$maxDistance' : 5 }


21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/mongoid_spacial/criterion/near_spacial.rb', line 21

def to_mongo_query(input)
  if input.kind_of?(Hash)
    raise ':point required to make valid query' unless input[:point]
    input[:point] = input[:point].to_lng_lat if input[:point].respond_to?(:to_lng_lat)
    query = {"$#{operator}" => input[:point] }
    if input[:max]
      query['$maxDistance'] = input[:max].to_f

      if unit = Mongoid::Spacial.earth_radius[input[:unit]]
        unit *= Mongoid::Spacial::RAD_PER_DEG unless operator =~ /sphere/i
        input[:unit] = unit
      end

      query['$maxDistance'] = query['$maxDistance']/input[:unit].to_f if input[:unit]
    end
    query
  elsif input.kind_of? Array
    if input.first.kind_of? Numeric
      {"$#{operator}" => input }
    else
      input[0] = input[0].to_lng_lat if input[0].respond_to?(:to_lng_lat)
      {"$#{operator}" => input[0], '$maxDistance' => input[1] }
    end
  end
end