class Mongo::Database::View
A class representing a view of a database.
@since 2.0.0
Attributes
@return [ Integer ] batch_size
The size of the batch of results
when sending the listCollections command.
@return [ Collection
] collection The command collection.
@api private
@return [ Integer ] limit The limit when sending a command.
Public Class Methods
Create the new database view.
@example Create the new database view.
View::Index.new(database)
@param [ Database
] database The database.
@since 2.0.0
# File lib/mongo/database/view.rb, line 97 def initialize(database) @database = database @batch_size = nil @limit = nil @collection = @database[Database::COMMAND] end
Public Instance Methods
Execute an aggregation on the database view.
@example Aggregate documents.
view.aggregate([ { "$listLocalSessions" => {} } ])
@param [ Array<Hash> ] pipeline The aggregation pipeline. @param [ Hash ] options The aggregation options.
@return [ Aggregation ] The aggregation object.
@since 2.10.0 @api private
# File lib/mongo/database/view.rb, line 121 def aggregate(pipeline, options = {}) Collection::View::Aggregation.new(self, pipeline, options) end
Get all the names of the non-system collections in the database.
@note The set of returned collection names depends on the version of
MongoDB server that fulfills the request.
@param [ Hash ] options Options
for the listCollections command.
@option options [ Integer ] :batch_size The batch size for results
returned from the listCollections command.
@return [ Array<String> ] The names of all non-system collections.
@since 2.0.0
# File lib/mongo/database/view.rb, line 54 def collection_names(options = {}) @batch_size = options[:batch_size] session = client.send(:get_session, options) cursor = read_with_retry_cursor(session, ServerSelector.primary, self) do |server| send_initial_query(server, session, name_only: true) end cursor.map do |info| if cursor.server.features.list_collections_enabled? info['name'] else (info['name'] && info['name'].sub("#{@database.name}.", '')) end end.reject do |name| name.start_with?('system.') || name.include?('$') end end
Get info on all the collections in the database.
@note The set of collections returned, and the schema of the
information hash per collection, depends on the MongoDB server version that fulfills the request.
@example Get info on each collection.
database.list_collections
@return [ Array<Hash> ] Info for each collection in the database.
@since 2.0.5
# File lib/mongo/database/view.rb, line 84 def list_collections session = client.send(:get_session) collections_info(session, ServerSelector.primary) end
Private Instance Methods
# File lib/mongo/database/view.rb, line 127 def collections_info(session, server_selector, options = {}, &block) description = nil cursor = read_with_retry_cursor(session, server_selector, self) do |server| # TODO take description from the connection used to send the query # once https://jira.mongodb.org/browse/RUBY-1601 is fixed. description = server.description send_initial_query(server, session, options) end # On 3.0+ servers, we get just the collection names. # On 2.6 server, we get collection names prefixed with the database # name. We need to filter system collections out here because # in the caller we don't know which server version executed the # command and thus what the proper filtering logic should be # (it is valid for collection names to have dots, thus filtering out # collections named system.* here for 2.6 servers would actually # filter out collections in the system database). if description.server_version_gte?('3.0') cursor.reject do |doc| doc['name'].start_with?('system.') || doc['name'].include?('$') end else docs = cursor.reject do |doc| doc['name'].start_with?("#{database.name}.system") || doc['name'].include?('$') end end end
# File lib/mongo/database/view.rb, line 154 def collections_info_spec(session, options = {}) { selector: { listCollections: 1, cursor: batch_size ? { batchSize: batch_size } : {} }, db_name: @database.name, session: session }.tap { |spec| spec[:selector][:nameOnly] = true if options[:name_only] } end
# File lib/mongo/database/view.rb, line 163 def initial_query_op(session, options = {}) Operation::CollectionsInfo.new(collections_info_spec(session, options)) end
# File lib/mongo/database/view.rb, line 167 def send_initial_query(server, session, options = {}) initial_query_op(session, options).execute(server) end