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
@return [ Array<Hash> ] pipeline The aggregation pipeline.
@return [ View
] view The collection view.
Public Class Methods
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
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
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
# File lib/mongo/collection/view/aggregation.rb, line 98 def aggregate_spec(session) Builder::Aggregation.new(pipeline, view, options.merge(session: session)).specification end
# File lib/mongo/collection/view/aggregation.rb, line 106 def initial_query_op(session) Operation::Aggregate.new(aggregate_spec(session)) end
# File lib/mongo/collection/view/aggregation.rb, line 102 def new(options) Aggregation.new(view, pipeline, options) end
# File lib/mongo/collection/view/aggregation.rb, line 118 def secondary_ok? !write? end
# 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
# File lib/mongo/collection/view/aggregation.rb, line 94 def server_selector @view.send(:server_selector) end
# File lib/mongo/collection/view/aggregation.rb, line 110 def valid_server?(server) server.standalone? || server.mongos? || server.primary? || secondary_ok? end
# 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
# 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