def group(opts, condition={}, initial={}, reduce=nil, finalize=nil)
if opts.is_a?(Hash)
return new_group(opts)
else
warn "Collection#group no longer take a list of parameters. This usage is deprecated and will be remove in v2.0." +
"Check out the new API at http://api.mongodb.org/ruby/current/Mongo/Collection.html#group-instance_method"
end
reduce = BSON::Code.new(reduce) unless reduce.is_a?(BSON::Code)
group_command = {
"group" => {
"ns" => @name,
"$reduce" => reduce,
"cond" => condition,
"initial" => initial
}
}
if opts.is_a?(Symbol)
raise MongoArgumentError, "Group takes either an array of fields to group by or a JavaScript function" +
"in the form of a String or BSON::Code."
end
unless opts.nil?
if opts.is_a? Array
key_type = "key"
key_value = {}
opts.each { |k| key_value[k] = 1 }
else
key_type = "$keyf"
key_value = opts.is_a?(BSON::Code) ? opts : BSON::Code.new(opts)
end
group_command["group"][key_type] = key_value
end
finalize = BSON::Code.new(finalize) if finalize.is_a?(String)
if finalize.is_a?(BSON::Code)
group_command['group']['finalize'] = finalize
end
result = @db.command(group_command)
if Mongo::Support.ok?(result)
result["retval"]
else
raise OperationFailure, "group command failed: #{result['errmsg']}"
end
end