Contains behaviour for aggregating values in Mongo.
Get all the aggregate values for the provided field.
@example Get all the aggregate values.
aggregable.aggregates(:likes)
@param [ String, Symbol ] field The field name.
@return [ Hash ] The aggregate values in the form:
{ "count" => 2.0, "max" => 1000.0, "min" => 500.0, "sum" => 1500.0, "avg" => 750.0 }
@since 3.0.0
# File lib/mongoid/contextual/aggregable/mongo.rb, line 24 def aggregates(field) if query.count > 0 result = collection.aggregate(pipeline(field)).to_a if result.empty? { "count" => query.count, "avg" => 0, "sum" => 0 } else result.first end else { "count" => 0 } end end
Get the average value of the provided field.
@example Get the average of a single field.
aggregable.avg(:likes)
@param [ Symbol ] field The field to average.
@return [ Float ] The average.
@since 3.0.0
# File lib/mongoid/contextual/aggregable/mongo.rb, line 47 def avg(field) aggregates(field)["avg"] end
Get the max value of the provided field. If provided a block, will return the Document with the greatest value for the field, in accordance with Ruby's enumerable API.
@example Get the max of a single field.
aggregable.max(:likes)
@example Get the document with the max value.
aggregable.max do |a, b| a.likes <=> b.likes end
@param [ Symbol ] field The field to max.
@return [ Float, Document ] The max value or document with the max
value.
@since 3.0.0
# File lib/mongoid/contextual/aggregable/mongo.rb, line 69 def max(field = nil) block_given? ? super() : aggregates(field)["max"] end
Get the min value of the provided field. If provided a block, will return the Document with the smallest value for the field, in accordance with Ruby's enumerable API.
@example Get the min of a single field.
aggregable.min(:likes)
@example Get the document with the min value.
aggregable.min do |a, b| a.likes <=> b.likes end
@param [ Symbol ] field The field to min.
@return [ Float, Document ] The min value or document with the min
value.
@since 3.0.0
# File lib/mongoid/contextual/aggregable/mongo.rb, line 91 def min(field = nil) block_given? ? super() : aggregates(field)["min"] end
Get the sum value of the provided field. If provided a block, will return the sum in accordance with Ruby's enumerable API.
@example Get the sum of a single field.
aggregable.sum(:likes)
@example Get the sum for the provided block.
aggregable.sum(&:likes)
@param [ Symbol ] field The field to sum.
@return [ Float ] The sum value.
@since 3.0.0
# File lib/mongoid/contextual/aggregable/mongo.rb, line 109 def sum(field = nil) block_given? ? super() : aggregates(field)["sum"] || 0 end