Module: Mongo::Collection::View::Readable
Relationships & Source Files | |
Extension / Inclusion / Inheritance Descendants | |
Included In:
| |
Defined in: | lib/mongo/collection/view/readable.rb |
Overview
Defines read related behavior for collection view.
Instance Method Summary
-
#aggregate(pipeline, options = {}) ⇒ Aggregation
Execute an aggregation on the collection view.
-
#allow_disk_use ⇒ View
Allows the server to write temporary data to disk while executing a find operation.
-
#allow_partial_results ⇒ View
Allows the query to get partial results if some shards are down.
-
#await_data ⇒ View
Tell the query’s cursor to stay open and wait for data.
-
#batch_size(batch_size = nil) ⇒ Integer, View
The number of documents returned in each batch of results from MongoDB.
-
#comment(comment = nil) ⇒ String, View
Associate a comment with the query.
-
#count(opts = {}) ⇒ Integer
deprecated
Deprecated.
Use #count_documents or #estimated_document_count instead. However, note that the following operators will need to be substituted when switching to #count_documents:
* $where should be replaced with $expr (only works on 3.6+) * $near should be replaced with $geoWithin with $center * $nearSphere should be replaced with $geoWithin with $centerSphere
-
#count_documents(opts = {}) ⇒ Integer
Get a count of matching documents in the collection.
-
#cursor_type(type = nil) ⇒ :tailable, ...
The type of cursor to use.
-
#distinct(field_name, opts = {}) ⇒ Array<Object>
Get a list of distinct values for a specific field.
-
#estimated_document_count(opts = {}) ⇒ Integer
Gets an estimate of the count of documents in a collection using collection metadata.
-
#hint(hint = nil) ⇒ Hash, View
The index that MongoDB will be forced to use for the query.
-
#limit(limit = nil) ⇒ Integer, View
The max number of docs to return from the query.
-
#map_reduce(map, reduce, options = {}) ⇒ MapReduce
Execute a map/reduce operation on the collection view.
-
#max_await_time_ms(max = nil) ⇒ Integer, View
A cumulative time limit in milliseconds for processing get more operations on a cursor.
-
#max_scan(value = nil) ⇒ Integer, View
deprecated
Deprecated.
This option is deprecated as of MongoDB server version 4.0.
-
#max_time_ms(max = nil) ⇒ Integer, View
A cumulative time limit in milliseconds for processing operations on a cursor.
-
#max_value(value = nil) ⇒ Hash, View
Set the maximum value to search.
-
#min_value(value = nil) ⇒ Hash, View
Set the minimum value to search.
-
#modifiers(doc = nil) ⇒ Hash, View
If called without arguments or with a nil argument, returns the legacy (OP_QUERY) server modifiers for the current view.
-
#no_cursor_timeout ⇒ View
The server normally times out idle cursors after an inactivity period (10 minutes) to prevent excess memory use.
- #parallel_scan(cursor_count, options = {})
-
#projection(document = nil) ⇒ Hash, View
The fields to include or exclude from each doc in the result set.
-
#read(value = nil) ⇒ Symbol, View
The read preference to use for the query.
- #read_concern Internal use only Internal use only
- #read_preference Internal use only Internal use only
-
#return_key(value = nil) ⇒ true, ...
Set whether to return only the indexed field or fields.
-
#show_disk_loc(value = nil) ⇒ true, ...
(also: #show_record_id)
Set whether the disk location should be shown for each document.
-
#show_record_id(value = nil)
Alias for #show_disk_loc.
-
#skip(number = nil) ⇒ Integer, View
The number of docs to skip before returning results.
-
#snapshot(value = nil)
deprecated
Deprecated.
This option is deprecated as of MongoDB server version 4.0.
-
#sort(spec = nil) ⇒ Hash, View
The key and direction pairs by which the result set will be sorted.
-
#timeout_ms(timeout_ms = nil) ⇒ Integer, View
The per-operation timeout in milliseconds.
- #collation(doc = nil) private
- #server_selector private
- #validate_doc!(doc) private
Instance Method Details
#aggregate(pipeline, options = {}) ⇒ Aggregation
Execute an aggregation on the collection view.
# File 'lib/mongo/collection/view/readable.rb', line 61
def aggregate(pipeline, = {}) = @options.merge( ) unless Mongo. aggregation = Aggregation.new(self, pipeline, ) # Because the $merge and $out pipeline stages write documents to the # collection, it is necessary to clear the cache when they are performed. # # Opt to clear the entire cache rather than one namespace because # the $out and $merge stages do not have to write to the same namespace # on which the aggregation is performed. QueryCache.clear if aggregation.write? aggregation end
#allow_disk_use ⇒ View
Allows the server to write temporary data to disk while executing a find operation.
# File 'lib/mongo/collection/view/readable.rb', line 80
def allow_disk_use configure(:allow_disk_use, true) end
#allow_partial_results ⇒ View
Allows the query to get partial results if some shards are down.
# File 'lib/mongo/collection/view/readable.rb', line 92
def allow_partial_results configure(:allow_partial_results, true) end
#await_data ⇒ View
Tell the query’s cursor to stay open and wait for data.
# File 'lib/mongo/collection/view/readable.rb', line 104
def await_data configure(:await_data, true) end
#batch_size(batch_size = nil) ⇒ Integer
, View
Specifying 1 or a negative number is analogous to setting a limit.
The number of documents returned in each batch of results from MongoDB.
# File 'lib/mongo/collection/view/readable.rb', line 121
def batch_size(batch_size = nil) configure(:batch_size, batch_size) end
#collation(doc = nil) (private)
# File 'lib/mongo/collection/view/readable.rb', line 752
def collation(doc = nil) configure(:collation, doc) end
#comment(comment = nil) ⇒ String
, View
Set profilingLevel to 2 and the comment will be logged in the profile collection along with the query.
Associate a comment with the query.
# File 'lib/mongo/collection/view/readable.rb', line 139
def comment(comment = nil) configure(:comment, comment) end
#count(opts = {}) ⇒ Integer
Use #count_documents or #estimated_document_count instead. However, note that the following operators will need to be substituted when switching to #count_documents:
* $where should be replaced with $expr (only works on 3.6+)
* $near should be replaced with $geoWithin with $center
* $nearSphere should be replaced with $geoWithin with $centerSphere
Get a count of matching documents in the collection.
# File 'lib/mongo/collection/view/readable.rb', line 175
def count(opts = {}) opts = @options.merge(opts) unless Mongo. cmd = { :count => collection.name, :query => filter } cmd[:skip] = opts[:skip] if opts[:skip] cmd[:hint] = opts[:hint] if opts[:hint] cmd[:limit] = opts[:limit] if opts[:limit] if read_concern cmd[:readConcern] = Options::Mapper.transform_values_to_strings( read_concern) end cmd[:maxTimeMS] = opts[:max_time_ms] if opts[:max_time_ms] Mongo::Lint.validate_underscore_read_preference(opts[:read]) read_pref = opts[:read] || read_preference selector = ServerSelector.get(read_pref || server_selector) with_session(opts) do |session| context = Operation::Context.new( client: client, session: session, operation_timeouts: operation_timeouts(opts) ) read_with_retry(session, selector, context) do |server| Operation::Count.new( selector: cmd, db_name: database.name, options: {:limit => -1}, read: read_pref, session: session, # For some reason collation was historically accepted as a # string key. Note that this isn't documented as valid usage. collation: opts[:collation] || opts['collation'] || collation, comment: opts[:comment], ).execute( server, context: context ) end.n.to_i end end
#count_documents(opts = {}) ⇒ Integer
Get a count of matching documents in the collection.
# File 'lib/mongo/collection/view/readable.rb', line 241
def count_documents(opts = {}) opts = @options.merge(opts) unless Mongo. pipeline = [:'$match' => filter] pipeline << { :'$skip' => opts[:skip] } if opts[:skip] pipeline << { :'$limit' => opts[:limit] } if opts[:limit] pipeline << { :'$group' => { _id: 1, n: { :'$sum' => 1 } } } opts = opts.slice(:hint, :max_time_ms, :read, :collation, :session, :comment, :timeout_ms) opts[:collation] ||= collation first = aggregate(pipeline, opts).first return 0 unless first first['n'].to_i end
#cursor_type(type = nil) ⇒ :tailable
, ...
The type of cursor to use. Can be :tailable
or :tailable_await
.
# File 'lib/mongo/collection/view/readable.rb', line 660
def cursor_type(type = nil) configure(:cursor_type, type) end
#distinct(field_name, opts = {}) ⇒ Array
<Object
>
Get a list of distinct values for a specific field.
# File 'lib/mongo/collection/view/readable.rb', line 343
def distinct(field_name, opts = {}) if field_name.nil? raise ArgumentError, 'Field name for distinct operation must be not nil' end opts = @options.merge(opts) unless Mongo. cmd = { :distinct => collection.name, :key => field_name.to_s, :query => filter, } cmd[:maxTimeMS] = opts[:max_time_ms] if opts[:max_time_ms] if read_concern cmd[:readConcern] = Options::Mapper.transform_values_to_strings( read_concern) end Mongo::Lint.validate_underscore_read_preference(opts[:read]) read_pref = opts[:read] || read_preference selector = ServerSelector.get(read_pref || server_selector) with_session(opts) do |session| context = Operation::Context.new( client: client, session: session, operation_timeouts: operation_timeouts(opts) ) read_with_retry(session, selector, context) do |server| Operation::Distinct.new( selector: cmd, db_name: database.name, options: {:limit => -1}, read: read_pref, session: session, comment: opts[:comment], # For some reason collation was historically accepted as a # string key. Note that this isn't documented as valid usage. collation: opts[:collation] || opts['collation'] || collation, ).execute( server, context: context ) end.first['values'] end end
#estimated_document_count(opts = {}) ⇒ Integer
Gets an estimate of the count of documents in a collection using collection metadata.
# File 'lib/mongo/collection/view/readable.rb', line 276
def estimated_document_count(opts = {}) unless view.filter.empty? raise ArgumentError, "Cannot call estimated_document_count when querying with a filter" end %i[limit skip].each do |opt| if .key?(opt) || opts.key?(opt) raise ArgumentError, "Cannot call estimated_document_count when querying with #{opt}" end end opts = @options.merge(opts) unless Mongo. Mongo::Lint.validate_underscore_read_preference(opts[:read]) read_pref = opts[:read] || read_preference selector = ServerSelector.get(read_pref || server_selector) with_session(opts) do |session| context = Operation::Context.new( client: client, session: session, operation_timeouts: operation_timeouts(opts) ) read_with_retry(session, selector, context) do |server| cmd = { count: collection.name } cmd[:maxTimeMS] = opts[:max_time_ms] if opts[:max_time_ms] if read_concern cmd[:readConcern] = Options::Mapper.transform_values_to_strings(read_concern) end result = Operation::Count.new( selector: cmd, db_name: database.name, read: read_pref, session: session, comment: opts[:comment], ).execute(server, context: context) result.n.to_i end end rescue Error::OperationFailure::Family => exc if exc.code == 26 # NamespaceNotFound # This should only happen with the aggregation pipeline path # (server 4.9+). Previous servers should return 0 for nonexistent # collections. 0 else raise end end
#hint(hint = nil) ⇒ Hash
, View
The index that MongoDB will be forced to use for the query.
# File 'lib/mongo/collection/view/readable.rb', line 394
def hint(hint = nil) configure(:hint, hint) end
#limit(limit = nil) ⇒ Integer
, View
The max number of docs to return from the query.
# File 'lib/mongo/collection/view/readable.rb', line 408
def limit(limit = nil) configure(:limit, limit) end
#map_reduce(map, reduce, options = {}) ⇒ MapReduce
Execute a map/reduce operation on the collection view.
#max_await_time_ms(max = nil) ⇒ Integer
, View
A cumulative time limit in milliseconds for processing get more operations on a cursor.
# File 'lib/mongo/collection/view/readable.rb', line 632
def max_await_time_ms(max = nil) configure(:max_await_time_ms, max) end
#max_scan(value = nil) ⇒ Integer
, View
This option is deprecated as of MongoDB server version 4.0.
Set the max number of documents to scan.
# File 'lib/mongo/collection/view/readable.rb', line 441
def max_scan(value = nil) configure(:max_scan, value) end
#max_time_ms(max = nil) ⇒ Integer
, View
A cumulative time limit in milliseconds for processing operations on a cursor.
# File 'lib/mongo/collection/view/readable.rb', line 646
def max_time_ms(max = nil) configure(:max_time_ms, max) end
#max_value(value = nil) ⇒ Hash
, View
Set the maximum value to search.
# File 'lib/mongo/collection/view/readable.rb', line 455
def max_value(value = nil) configure(:max_value, value) end
#min_value(value = nil) ⇒ Hash
, View
Set the minimum value to search.
# File 'lib/mongo/collection/view/readable.rb', line 469
def min_value(value = nil) configure(:min_value, value) end
#modifiers(doc = nil) ⇒ Hash
, View
If called without arguments or with a nil argument, returns the legacy (OP_QUERY) server modifiers for the current view. If called with a non-nil argument, which must be a Hash or a subclass, merges the provided modifiers into the current view. Both string and symbol keys are allowed in the input hash.
#no_cursor_timeout ⇒ View
The server normally times out idle cursors after an inactivity period (10 minutes) to prevent excess memory use. Set this option to prevent that.
# File 'lib/mongo/collection/view/readable.rb', line 482
def no_cursor_timeout configure(:no_cursor_timeout, true) end
#parallel_scan(cursor_count, options = {})
# File 'lib/mongo/collection/view/readable.rb', line 702
def parallel_scan(cursor_count, = {}) if [:session] # The session would be overwritten by the one in +options+ later. session = client.get_session(@options) else session = nil end server = server_selector.select_server(cluster, nil, session) spec = { coll_name: collection.name, db_name: database.name, cursor_count: cursor_count, read_concern: read_concern, session: session, }.update( ) session = spec[:session] op = Operation::ParallelScan.new(spec) # Note that the context object shouldn't be reused for subsequent # GetMore operations. context = Operation::Context.new(client: client, session: session) result = op.execute(server, context: context) result.cursor_ids.map do |cursor_id| spec = { cursor_id: cursor_id, coll_name: collection.name, db_name: database.name, session: session, batch_size: batch_size, to_return: 0, # max_time_ms is not being passed here, I assume intentionally? } op = Operation::GetMore.new(spec) context = Operation::Context.new( client: client, session: session, connection_global_id: result.connection_global_id, ) result = if server.load_balancer? # Connection will be checked in when cursor is drained. connection = server.pool.check_out(context: context) op.execute_with_connection(connection, context: context) else op.execute(server, context: context) end Cursor.new(self, result, server, session: session) end end
#projection(document = nil) ⇒ Hash
, View
A value of 0 excludes a field from the doc. A value of 1 includes it. Values must all be 0 or all be 1, with the exception of the _id value. The _id field is included by default. It must be excluded explicitly.
The fields to include or exclude from each doc in the result set.
# File 'lib/mongo/collection/view/readable.rb', line 500
def projection(document = nil) validate_doc!(document) if document configure(:projection, document) end
#read(value = nil) ⇒ Symbol, View
If none is specified for the query, the read preference of the collection will be used.
The read preference to use for the query.
# File 'lib/mongo/collection/view/readable.rb', line 516
def read(value = nil) return read_preference if value.nil? configure(:read, value) end
#read_concern
# File 'lib/mongo/collection/view/readable.rb', line 674
def read_concern if [:session] && [:session].in_transaction? [:session].send(:txn_read_concern) || collection.client.read_concern else collection.read_concern end end
#read_preference
# File 'lib/mongo/collection/view/readable.rb', line 683
def read_preference @read_preference ||= begin # Operation read preference is always respected, and has the # highest priority. If we are in a transaction, we look at # transaction read preference and default to client, ignoring # collection read preference. If we are not in transaction we # look at collection read preference which defaults to client. rp = if [:read] [:read] elsif [:session] && [:session].in_transaction? [:session].txn_read_preference || collection.client.read_preference else collection.read_preference end Lint.validate_underscore_read_preference(rp) rp end end
#return_key(value = nil) ⇒ true
, ...
Set whether to return only the indexed field or fields.
# File 'lib/mongo/collection/view/readable.rb', line 531
def return_key(value = nil) configure(:return_key, value) end
#server_selector (private)
# File 'lib/mongo/collection/view/readable.rb', line 756
def server_selector @server_selector ||= if [:session] && [:session].in_transaction? ServerSelector.get(read_preference || client.server_selector) else ServerSelector.get(read_preference || collection.server_selector) end end
#show_disk_loc(value = nil) ⇒ true
, ...
Also known as: #show_record_id
Set whether the disk location should be shown for each document.
# File 'lib/mongo/collection/view/readable.rb', line 546
def show_disk_loc(value = nil) configure(:show_disk_loc, value) end
#show_record_id(value = nil)
Alias for #show_disk_loc.
# File 'lib/mongo/collection/view/readable.rb', line 549
alias :show_record_id :show_disk_loc
#skip(number = nil) ⇒ Integer
, View
The number of docs to skip before returning results.
# File 'lib/mongo/collection/view/readable.rb', line 562
def skip(number = nil) configure(:skip, number) end
#snapshot(value = nil)
This option is deprecated as of MongoDB server version 4.0.
When set to true, prevents documents from returning more than once.
Set the snapshot value for the view.
# File 'lib/mongo/collection/view/readable.rb', line 580
def snapshot(value = nil) configure(:snapshot, value) end
#sort(spec = nil) ⇒ Hash
, View
The key and direction pairs by which the result set will be sorted.
# File 'lib/mongo/collection/view/readable.rb', line 595
def sort(spec = nil) configure(:sort, spec) end
#timeout_ms(timeout_ms = nil) ⇒ Integer
, View
The per-operation timeout in milliseconds. Must a positive integer.
# File 'lib/mongo/collection/view/readable.rb', line 669
def timeout_ms(timeout_ms = nil) configure(:timeout_ms, timeout_ms) end
#validate_doc!(doc) (private)
# File 'lib/mongo/collection/view/readable.rb', line 764
def validate_doc!(doc) raise Error::InvalidDocument.new unless doc.respond_to?(:keys) end