Skip to content

Instantly share code, notes, and snippets.

@zhengjia
Forked from bernerdschaefer/issue-139.rb
Created June 18, 2011 15:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zhengjia/1033197 to your computer and use it in GitHub Desktop.
Save zhengjia/1033197 to your computer and use it in GitHub Desktop.
require 'mongoid'
require 'rspec'
Mongoid.configure do |config|
config.master = Mongo::Connection.new.db('testing')
config.autocreate_indexes = true
end
class User
include Mongoid::Document
field :latlng, :type => Array
collection.remove
index [[:latlng, Mongo::GEO2D]]
end
context "geo queries" do
let!(:closest) { User.create(:latlng => [50, 50]) }
let!(:middle) { User.create(:latlng => [55, 55]) }
let!(:farthest) { User.create(:latlng => [60, 60]) }
after { User.delete_all }
context "$center" do
subject { User.where(:latlng.within => {"$center" => [[50, 50], 10]}).entries }
it "should filted users outside the radius" do
subject.size.should == 2
end
it "should return in order of distance" do
subject[0].should == closest
subject[1].should == middle
end
end
context "dbNear" do
let(:query) do
BSON::OrderedHash.new.tap do |query|
query["geoNear"] = "users"
query["near"] = [50, 50] # lat / long
query["num"] = 2 # max results
end
end
subject { User.collection.db.command(query) }
it "should filter users outside the center and max size" do
subject["results"].size.should == 2
end
it "should return in order of distance" do
subject["results"][0]["obj"]["_id"].should == closest.id
subject["results"][1]["obj"]["_id"].should == middle.id
end
it "should include the distance" do
subject["results"][0]["dis"].should == 0
subject["results"][1]["dis"].should be_close(7, 1)
end
it "should be convertible into mongoid documents" do
subject["results"].map do |result|
Mongoid::Factory.build(User, result["obj"])
end.should == [closest, middle]
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment