123456789_123456789_123456789_123456789_123456789_

Module: Mongoid::Contextual::Aggregable::Mongo

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Included In:
Defined in: lib/mongoid/contextual/aggregable/mongo.rb

Overview

Contains behavior for aggregating values in Mongo.

Instance Method Summary

Instance Method Details

#aggregates(field) ⇒ Hash

Get all the aggregate values for the provided field.

Examples:

Get all the aggregate values.

aggregable.aggregates(:likes)
# => {
#   "count" => 2.0,
#   "max" => 1000.0,
#   "min" => 500.0,
#   "sum" => 1500.0,
#   "avg" => 750.0
# }

Parameters:

Returns:

  • (Hash)

    A Hash containing the aggregate values. If no documents are found, then returned ::Hash will have count, sum of 0 and max, min, avg of nil.

[ GitHub ]

  
# File 'lib/mongoid/contextual/aggregable/mongo.rb', line 27

def aggregates(field)
  result = collection.aggregate(
    pipeline(field),
    session: _session,
    hint: view.hint
  ).to_a

  if result.empty?
    Aggregable::EMPTY_RESULT.dup
  else
    result.first
  end
end

#avg(field) ⇒ Float

Get the average value of the provided field.

Examples:

Get the average of a single field.

aggregable.avg(:likes)

Parameters:

  • field (Symbol)

    The field to average.

Returns:

  • (Float)

    The average.

[ GitHub ]

  
# File 'lib/mongoid/contextual/aggregable/mongo.rb', line 49

def avg(field)
  aggregates(field)['avg']
end

#max(field = nil) ⇒ Float | Document

Get the max value of the provided field. If provided a block, will return the ::Mongoid::Document with the greatest value for the field, in accordance with Ruby’s enumerable API.

Examples:

Get the max of a single field.

aggregable.max(:likes)

Get the document with the max value.

aggregable.max do |a, b|
  a.likes <=> b.likes
end

Parameters:

  • field (Symbol) (defaults to: nil)

    The field to max.

Returns:

  • (Float | Document)

    The max value or document with the max value.

[ GitHub ]

  
# File 'lib/mongoid/contextual/aggregable/mongo.rb', line 69

def max(field = nil)
  block_given? ? super() : aggregates(field)['max']
end

#min(field = nil) ⇒ Float | Document

Get the min value of the provided field. If provided a block, will return the ::Mongoid::Document with the smallest value for the field, in accordance with Ruby’s enumerable API.

Examples:

Get the min of a single field.

aggregable.min(:likes)

Get the document with the min value.

aggregable.min do |a, b|
  a.likes <=> b.likes
end

Parameters:

  • field (Symbol) (defaults to: nil)

    The field to min.

Returns:

  • (Float | Document)

    The min value or document with the min value.

[ GitHub ]

  
# File 'lib/mongoid/contextual/aggregable/mongo.rb', line 89

def min(field = nil)
  block_given? ? super() : aggregates(field)['min']
end

#pipeline(field) ⇒ Array (private)

This method is for internal use only.

Get the aggregation pipeline for provided field.

Examples:

Get the pipeline.

aggregable.pipeline(:likes)

Parameters:

Returns:

  • (Array)

    The array of pipeline operators.

[ GitHub ]

  
# File 'lib/mongoid/contextual/aggregable/mongo.rb', line 124

def pipeline(field)
  db_field = "$#{database_field_name(field)}"
  sort, skip, limit = criteria.options.values_at(:sort, :skip, :limit)

  pipeline = []
  pipeline << { '$match' => criteria.exists(field => true).selector }
  pipeline << { '$sort' => sort } if sort && (skip || limit)
  pipeline << { '$skip' => skip } if skip
  pipeline << { '$limit' => limit } if limit
  pipeline << {
    '$group' => {
      '_id' => field.to_s,
      'count' => { '$sum' => 1 },
      'max' => { '$max' => db_field },
      'min' => { '$min' => db_field },
      'sum' => { '$sum' => db_field },
      'avg' => { '$avg' => db_field }
    }
  }
end

#sum(field = nil) ⇒ Float

Get the sum value of the provided field. If provided a block, will return the sum in accordance with Ruby’s enumerable API.

Examples:

Get the sum of a single field.

aggregable.sum(:likes)

Get the sum for the provided block.

aggregable.sum(&:likes)

Parameters:

  • field (Symbol | Numeric) (defaults to: nil)

    The field to sum, or the initial value of the sum when a block is given.

Returns:

  • (Float)

    The sum value.

[ GitHub ]

  
# File 'lib/mongoid/contextual/aggregable/mongo.rb', line 106

def sum(field = nil)
  return super(field || 0) if block_given?

  aggregates(field)['sum'] || 0
end