class Mongo::Protocol::Query
MongoDB Wire protocol Query
message.
This is a client request message that is sent to the server in order to retrieve documents matching provided query.
Users may also provide additional options such as a projection, to select a subset of the fields, a number to skip or a limit on the number of returned documents.
There are a variety of flags that can be used to adjust cursor parameters or the desired consistency and integrity the results.
@api semipublic
Constants
Attributes
Public Class Methods
Creates a new Query
message
@example Find all users named Tyler.
Query.new('xgen', 'users', {:name => 'Tyler'})
@example Find all users named Tyler skipping 5 and returning 10.
Query.new('xgen', 'users', {:name => 'Tyler'}, :skip => 5, :limit => 10)
@example Find all users with slave ok bit set
Query.new('xgen', 'users', {:name => 'Tyler'}, :flags => [:slave_ok])
@example Find all user ids.
Query.new('xgen', 'users', {}, :fields => {:id => 1})
@param database [String, Symbol] The database to query. @param collection [String, Symbol] The collection to query. @param selector [Hash] The query selector. @param options [Hash] The additional query options.
@option options :project [Hash] The projection. @option options :skip [Integer] The number of documents to skip. @option options :limit [Integer] The number of documents to return. @option options :flags [Array] The flags for the query message.
Supported flags: +:tailable_cursor+, +:slave_ok+, +:oplog_replay+, +:no_cursor_timeout+, +:await_data+, +:exhaust+, +:partial+
# File lib/mongo/protocol/query.rb, line 61 def initialize(database, collection, selector, options = {}) @database = database @namespace = "#{database}.#{collection}" @selector = selector @options = options @project = options[:project] @limit = determine_limit @skip = options[:skip] || 0 @flags = options[:flags] || [] @upconverter = Upconverter.new(collection, selector, options, flags) super end
Public Instance Methods
Compress the message, if the command being sent permits compression. Otherwise returns self.
@param [ String, Symbol
] compressor The compressor to use. @param [ Integer ] zlib_compression_level The zlib compression level to use.
@return [ Message
] A Protocol::Compressed
message or self,
depending on whether this message can be compressed.
@since 2.5.0 @api private
# File lib/mongo/protocol/query.rb, line 114 def maybe_compress(compressor, zlib_compression_level = nil) compress_if_possible(selector.keys.first, compressor, zlib_compression_level) end
Return the event payload for monitoring.
@example Return the event payload.
message.payload
@return [ BSON::Document ] The event payload.
@since 2.1.0
# File lib/mongo/protocol/query.rb, line 82 def payload BSON::Document.new( command_name: upconverter.command_name, database_name: @database, command: upconverter.command, request_id: request_id ) end
Query
messages require replies from the database.
@example Does the message require a reply?
message.replyable?
@return [ true ] Always true for queries.
@since 2.0.0
# File lib/mongo/protocol/query.rb, line 99 def replyable? true end
Serializes message into bytes that can be sent on the wire.
@param [ BSON::ByteBuffer ] buffer where the message should be inserted. @param [ Integer ] max_bson_size The maximum bson object size.
@return [ BSON::ByteBuffer ] buffer containing the serialized message.
Mongo::Protocol::Message#serialize
# File lib/mongo/protocol/query.rb, line 124 def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) validate_document_size!(max_bson_size) super end
Private Instance Methods
# File lib/mongo/protocol/query.rb, line 166 def determine_limit [ @options[:limit] || @options[:batch_size], @options[:batch_size] || @options[:limit] ].min || 0 end
Validate that the documents in this message are all smaller than the maxBsonObjectSize. If not, raise an exception.
# File lib/mongo/protocol/query.rb, line 138 def validate_document_size!(max_bson_size) max_bson_size ||= Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE documents = if @selector.key?(:documents) @selector[:documents] elsif @selector.key?(:deletes) @selector[:deletes] elsif @selector.key?(:updates) @selector[:updates] else [] end contains_too_large_document = documents.any? do |doc| doc.to_bson.length > max_bson_size end if contains_too_large_document raise Error::MaxBSONSize.new('The document exceeds maximum allowed BSON object size after serialization') end end