Class: Mongo::Database::View
Relationships & Source Files | |
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
self,
Forwardable
|
|
Instance Chain:
|
|
Inherits: | Object |
Defined in: | lib/mongo/database/view.rb |
Overview
A class representing a view of a database.
Class Method Summary
-
.new(database, options = {}) ⇒ View
constructor
Create the new database view.
Instance Attribute Summary
- #batch_size ⇒ Integer readonly
- #collection ⇒ Collection readonly
- #database readonly Internal use only Internal use only
- #limit ⇒ Integer readonly
- #operation_timeout_ms ⇒ Integer | nil | The timeout_ms value that was passed as an option to the view. readonly Internal use only Internal use only
::Mongo::CursorHost
- Included
#cursor | Returns the cursor associated with this view, if any. |
#timeout_mode |
Instance Method Summary
-
#aggregate(pipeline, options = {}) ⇒ Collection::View::Aggregation
Internal use only
Internal use only
Execute an aggregation on the database view.
-
#collection_names(options = {}) ⇒ Array<String>
Get all the names of the non-system collections in the database.
-
#list_collections(options = {}) ⇒ Array<Hash>
Get info on all the collections in the database.
- #operation_timeouts(opts = {}) ⇒ Hash Internal use only Internal use only
-
#timeout_ms ⇒ Integer | nil
The timeout_ms value to use for this operation; either specified as an option to the view, or inherited from the database.
- #collections_info(session, server_selector, options = {}, &block) private
- #collections_info_spec(session, options = {}) private
- #initial_query_op(session, options = {}) private
-
#send_initial_query(server, session, context, options = {}) ⇒ Operation::Result
private
Sends command that obtains information about the database.
::Mongo::Cursor::NonTailable
- Included
#cursor_type | These views are always non-tailable. |
#timeout_mode | These views apply timeouts to each iteration of a cursor, as opposed to the entire lifetime of the cursor. |
::Mongo::CursorHost
- Included
#validate_timeout_mode! | Ensure the timeout mode is appropriate for other options that have been given. |
::Mongo::Retryable
- Included
#read_worker | Returns the read worker for handling retryable reads. |
#select_server | This is a separate method to make it possible for the test suite to assert that server selection is performed during retry attempts. |
#write_worker | Returns the write worker for handling retryable writes. |
Constructor Details
.new(database, options = {}) ⇒ View
Create the new database view.
# File 'lib/mongo/database/view.rb', line 149
def initialize(database, = {}) @database = database @operation_timeout_ms = .delete(:timeout_ms) validate_timeout_mode!( ) @batch_size = nil @limit = nil @collection = @database[Database::COMMAND] end
Instance Attribute Details
#batch_size ⇒ Integer
(readonly)
# File 'lib/mongo/database/view.rb', line 40
attr_reader :batch_size
#collection ⇒ Collection (readonly)
# File 'lib/mongo/database/view.rb', line 46
attr_reader :collection
#database (readonly)
# File 'lib/mongo/database/view.rb', line 161
attr_reader :database
#limit ⇒ Integer
(readonly)
# File 'lib/mongo/database/view.rb', line 43
attr_reader :limit
#operation_timeout_ms ⇒ Integer
| nil
| The
timeout_ms value
that
was
passed
as
an
option
to
the
view
. (readonly)
# File 'lib/mongo/database/view.rb', line 167
attr_reader :operation_timeout_ms
Instance Method Details
#aggregate(pipeline, options = {}) ⇒ Collection::View::Aggregation
Execute an aggregation on the database view.
# File 'lib/mongo/database/view.rb', line 183
def aggregate(pipeline, = {}) Collection::View::Aggregation.new(self, pipeline, ) end
#collection_names(options = {}) ⇒ Array
<String
>
The set of returned collection names depends on the version of MongoDB server that fulfills the request.
Get all the names of the non-system collections in the database.
See https://mongodb.com/docs/manual/reference/command/listCollections/
for more information and usage.
# File 'lib/mongo/database/view.rb', line 75
def collection_names( = {}) @batch_size = [:batch_size] session = client.get_session( ) context = Operation::Context.new( client: client, session: session, operation_timeouts: operation_timeouts( ) ) cursor = read_with_retry_cursor(session, ServerSelector.primary, self, context: context) do |server| send_initial_query(server, session, context, .merge(name_only: true)) end cursor.map do |info| if cursor.initial_result.connection_description.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
#collections_info(session, server_selector, options = {}, &block) (private)
# File 'lib/mongo/database/view.rb', line 210
def collections_info(session, server_selector, = {}, &block) description = nil context = Operation::Context.new( client: client, session: session, operation_timeouts: operation_timeouts( ) ) cursor = read_with_retry_cursor(session, server_selector, self, context: context) 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, context, ) 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 cursor.reject do |doc| doc['name'].start_with?("#{database.name}.system") || doc['name'].include?('$') end end end
#collections_info_spec(session, options = {}) (private)
# File 'lib/mongo/database/view.rb', line 242
def collections_info_spec(session, = {}) { selector: { listCollections: 1, cursor: batch_size ? { batchSize: batch_size } : {} }, db_name: @database.name, session: session }.tap do |spec| spec[:selector][:nameOnly] = true if [:name_only] spec[:selector][:filter] = [:filter] if [:filter] spec[:selector][: ] = true if [: ] spec[:comment] = [:comment] if [:comment] end end
#initial_query_op(session, options = {}) (private)
# File 'lib/mongo/database/view.rb', line 256
def initial_query_op(session, = {}) Operation::CollectionsInfo.new(collections_info_spec(session, )) end
#list_collections(options = {}) ⇒ Array
<Hash
>
The set of collections returned, and the schema of the information hash per collection, depends on the MongoDB server version that fulfills the request.
Get info on all the collections in the database.
# File 'lib/mongo/database/view.rb', line 127
def list_collections( = {}) session = client.get_session( ) collections_info(session, ServerSelector.primary, ) end
#operation_timeouts(opts = {}) ⇒ Hash
# File 'lib/mongo/database/view.rb', line 198
def operation_timeouts(opts = {}) {}.tap do |result| if opts[:timeout_ms] || operation_timeout_ms result[:operation_timeout_ms] = opts.delete(:timeout_ms) || operation_timeout_ms else result[:inherited_timeout_ms] = database.timeout_ms end end end
#send_initial_query(server, session, context, options = {}) ⇒ Operation::Result (private)
Sends command that obtains information about the database.
This command returns a cursor, so there could be additional commands, therefore this method is called send initial command.
# File 'lib/mongo/database/view.rb', line 285
def send_initial_query(server, session, context, = {}) opts = .dup execution_opts = {} if opts.key?(:deserialize_as_bson) execution_opts[:deserialize_as_bson] = opts.delete(:deserialize_as_bson) end if server.load_balancer? connection = server.pool.check_out(context: context) initial_query_op(session, opts).execute_with_connection( connection, context: context, options: execution_opts ) else initial_query_op(session, opts).execute( server, context: context, options: execution_opts ) end end
#timeout_ms ⇒ Integer
| nil
The timeout_ms value to use for this operation; either specified as an option to the view, or inherited from the database.
# File 'lib/mongo/database/view.rb', line 191
def timeout_ms operation_timeout_ms || database.timeout_ms end