class Mongo::Database::View

A class representing a view of a database.

@since 2.0.0

Attributes

batch_size[R]

@return [ Integer ] batch_size The size of the batch of results

when sending the listCollections command.
collection[R]

@return [ Collection ] collection The command collection.

database[R]

@api private

limit[R]

@return [ Integer ] limit The limit when sending a command.

Public Class Methods

new(database) click to toggle source

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

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

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
collection_names(options = {}) click to toggle source

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
list_collections() click to toggle source

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

collections_info(session, server_selector, options = {}, &block) click to toggle source
# 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
collections_info_spec(session, options = {}) click to toggle source
# 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
initial_query_op(session, options = {}) click to toggle source
# File lib/mongo/database/view.rb, line 163
def initial_query_op(session, options = {})
  Operation::CollectionsInfo.new(collections_info_spec(session, options))
end
send_initial_query(server, session, options = {}) click to toggle source
# File lib/mongo/database/view.rb, line 167
def send_initial_query(server, session, options = {})
  initial_query_op(session, options).execute(server)
end