diff --git a/lib/mongo/cursor.rb b/lib/mongo/cursor.rb index d2e54cd..c3d99a5 100644 --- a/lib/mongo/cursor.rb +++ b/lib/mongo/cursor.rb @@ -72,6 +72,18 @@ module Mongo return 0 if response['errmsg'] == "ns missing" raise OperationFailure, "Count failed: #{response['errmsg']}" end + + # Sort the results of the query with a hash of keys and orders + # + # Sorts should be formed as such: + # {:name=>-1} (sort by name, descending) OR {:name=>1} (sort by name, ascending) + # options are stackable, with the last option being the priority, i.e.: + # {:name => -1, :age => 1} (name descending, age asending) + def sort(order_hash = {}) + raise InvalidOperation, "can't call Cursor#sort on a used cursor" if @query_run + @query.order_by = order_hash + self + end # Limits the number of results to be returned by this cursor. # diff --git a/test/test_cursor.rb b/test/test_cursor.rb index bda65f2..0744715 100644 --- a/test/test_cursor.rb +++ b/test/test_cursor.rb @@ -57,6 +57,23 @@ class CursorTest < Test::Unit::TestCase assert_equal 0, @@db['acollectionthatdoesn'].count() end + + def test_sort + @@coll.clear + 5.times{|x| @@coll.insert({"a" => x, "b" => 5-x}) } + + assert_kind_of Cursor, @@coll.find().sort({:a=>1}) + + assert_equal 0, @@coll.find().sort({:a => 1}).next_object["a"] + assert_equal 4, @@coll.find().sort({:a => -1}).next_object["a"] + + assert_equal 1, @@coll.find().sort({:a => 1, :b => 1}).next_object["b"] + assert_equal 5, @@coll.find().sort({:a => 1, :b => -1}).next_object["b"] + + assert_equal 4, @@coll.find().sort({:a => 1}).sort({:a => -1}).next_object["a"] + assert_equal 4, @@coll.find().sort({:a => 1}).sort({:a => -1}).next_object["a"] + + end def test_limit @@coll.clear