class Mongo::Collection::View::Aggregation

Provides behavior around an aggregation pipeline on a collection view.

@since 2.0.0

Constants

REROUTE

The reroute message.

@since 2.1.0 @deprecated

Attributes

pipeline[R]

@return [ Array<Hash> ] pipeline The aggregation pipeline.

view[R]

@return [ View ] view The collection view.

Public Class Methods

new(view, pipeline, options = {}) click to toggle source

Initialize the aggregation for the provided collection view, pipeline and options.

@example Create the new aggregation view.

Aggregation.view.new(view, pipeline)

@param [ Collection::View ] view The collection view. @param [ Array<Hash> ] pipeline The pipeline of operations. @param [ Hash ] options The aggregation options.

@since 2.0.0

# File lib/mongo/collection/view/aggregation.rb, line 74
def initialize(view, pipeline, options = {})
  @view = view
  @pipeline = pipeline.dup
  @options = BSON::Document.new(options).freeze
end

Public Instance Methods

allow_disk_use(value = nil) click to toggle source

Set to true if disk usage is allowed during the aggregation.

@example Set disk usage flag.

aggregation.allow_disk_use(true)

@param [ true, false ] value The flag value.

@return [ true, false, Aggregation ] The aggregation if a value was

set or the value if used as a getter.

@since 2.0.0

# File lib/mongo/collection/view/aggregation.rb, line 59
def allow_disk_use(value = nil)
  configure(:allow_disk_use, value)
end
explain() click to toggle source

Get the explain plan for the aggregation.

@example Get the explain plan for the aggregation.

aggregation.explain

@return [ Hash ] The explain plan.

@since 2.0.0

# File lib/mongo/collection/view/aggregation.rb, line 88
def explain
  self.class.new(view, pipeline, options.merge(explain: true)).first
end

Private Instance Methods

aggregate_spec(session) click to toggle source
# File lib/mongo/collection/view/aggregation.rb, line 98
def aggregate_spec(session)
  Builder::Aggregation.new(pipeline, view, options.merge(session: session)).specification
end
initial_query_op(session) click to toggle source
# File lib/mongo/collection/view/aggregation.rb, line 106
def initial_query_op(session)
  Operation::Aggregate.new(aggregate_spec(session))
end
new(options) click to toggle source
# File lib/mongo/collection/view/aggregation.rb, line 102
def new(options)
  Aggregation.new(view, pipeline, options)
end
secondary_ok?() click to toggle source
# File lib/mongo/collection/view/aggregation.rb, line 118
def secondary_ok?
  !write?
end
send_initial_query(server, session) click to toggle source
# File lib/mongo/collection/view/aggregation.rb, line 122
def send_initial_query(server, session)
  unless valid_server?(server)
    log_warn("Rerouting the Aggregation operation to the primary server - #{server.summary} is not suitable")
    server = cluster.next_primary(nil, session)
  end
  validate_collation!(server)
  initial_query_op(session).execute(server)
end
server_selector() click to toggle source
# File lib/mongo/collection/view/aggregation.rb, line 94
def server_selector
  @view.send(:server_selector)
end
valid_server?(server) click to toggle source
# File lib/mongo/collection/view/aggregation.rb, line 110
def valid_server?(server)
  server.standalone? || server.mongos? || server.primary? || secondary_ok?
end
validate_collation!(server) click to toggle source
# File lib/mongo/collection/view/aggregation.rb, line 131
def validate_collation!(server)
  if options[:collation] && !server.features.collation_enabled?
    raise Error::UnsupportedCollation.new
  end
end
write?() click to toggle source
# File lib/mongo/collection/view/aggregation.rb, line 114
def write?
  pipeline.any? { |op| op.key?('$out') || op.key?(:$out) || op.key?('$merge') || op.key?(:$merge) }
end