Skip to content

Instantly share code, notes, and snippets.

@mharris717
Created November 25, 2009 06:36
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 mharris717/242528 to your computer and use it in GitHub Desktop.
Save mharris717/242528 to your computer and use it in GitHub Desktop.
class Mongo::Collection
def sum_by_raw(ops)
reduce_function = "function (obj, prev) { prev.count += (obj.#{ops[:sum_field]} ? obj.#{ops[:sum_field]} : 0); }"
code = Mongo::Code.new(reduce_function)
group([ops[:key]].flatten, ops[:filter]||{}, {"count" => 0},code)
end
def sum_by(ops)
sum_by_raw(ops).inject({}) { |h,a| k = ops[:key]; h.merge(a[k] => a['count'])}
end
end
# @coll.save('a' => 'a', 'b' => 1)
# @coll.save("a" => 'a', 'b' => 3)
# @coll.save('a' => 'b', 'b' => 2)
#
# @coll.sum_by(:key => 'a', :sum_field => 'b').should == {'a' => 4, 'b' => 2}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment