Class: Mongo::Operation::Result
- Inherits:
-
Object
- Object
- Mongo::Operation::Result
- Extended by:
- Forwardable
- Includes:
- Enumerable
- Defined in:
- lib/mongo/operation/result.rb,
lib/mongo/operation/shared/result/aggregatable.rb,
lib/mongo/operation/shared/result/use_legacy_error_parser.rb
Overview
Result wrapper for wire protocol replies.
An operation has zero or one replies. The only operations producing zero replies are unacknowledged writes; all other operations produce one reply. This class provides an object that can be operated on (for example, to check whether an operation succeeded) even when the operation did not produce a reply (in which case it is assumed to have succeeded).
Direct Known Subclasses
Aggregate::Result, CollectionsInfo::Result, Delete::BulkResult, Delete::Result, Explain::Result, Find::Legacy::Result, Find::Result, GetMore::Result, Indexes::Result, Insert::BulkResult, Insert::Result, ListCollections::Result, MapReduce::Result, ParallelScan::Result, Update::BulkResult, Update::Legacy::Result, Update::Result, UsersInfo::Result
Defined Under Namespace
Modules: Aggregatable, UseLegacyErrorParser
Constant Summary collapse
- CURSOR =
The field name for the cursor document in an aggregation.
'cursor'.freeze
- CURSOR_ID =
The cursor id field in the cursor document.
'id'.freeze
- FIRST_BATCH =
The field name for the first batch of a cursor.
'firstBatch'.freeze
- NEXT_BATCH =
The field name for the next batch of a cursor.
'nextBatch'.freeze
- NAMESPACE =
The namespace field in the cursor document.
'ns'.freeze
- N =
The number of documents updated in the write.
'n'.freeze
- OK =
The ok status field in the result.
'ok'.freeze
- RESULT =
The result field constant.
'result'.freeze
Instance Attribute Summary collapse
-
#connection_description ⇒ Server::Description
readonly
private
Server description of the server that the operation was performed on that this result is for.
-
#replies ⇒ Array<Protocol::Message>
readonly
Replies The wrapped wire protocol replies.
Instance Method Summary collapse
-
#acknowledged? ⇒ true, false
Is the result acknowledged?.
-
#cluster_time ⇒ nil | ClusterTime
Get the cluster time reported in the server response.
-
#cursor_id ⇒ Integer
Get the cursor id if the response is acknowledged.
-
#documents ⇒ Array<BSON::Document>
Get the documents in the result.
-
#each {|Each| ... } ⇒ Enumerator
Iterate over the documents in the replies.
-
#error ⇒ Error::OperationFailure
private
The exception instance (of the Error::OperationFailure class) that would be raised during processing of this result.
-
#initialize(replies, connection_description = nil) ⇒ Result
constructor
private
Initialize a new result.
-
#inspect ⇒ String
Get the pretty formatted inspection of the result.
-
#labels ⇒ Array
Gets the set of error labels associated with the result.
-
#namespace ⇒ Nil
Get the namespace of the cursor.
-
#ok? ⇒ true, false
Check the first document’s ok field.
-
#operation_time ⇒ Object
Get the operation time reported in the server response.
-
#reply ⇒ Protocol::Message
Get the reply from the result.
-
#returned_count ⇒ Integer
Get the count of documents returned by the server.
-
#successful? ⇒ true, false
If the result was a command then determine if it was considered a success.
-
#topology_version ⇒ TopologyVersion | nil
The topology version.
-
#validate! ⇒ Result
Validate the result by checking for any errors.
-
#write_concern_error? ⇒ Boolean
private
Whether the operation failed with a write concern error.
-
#written_count ⇒ Integer
(also: #n)
Get the number of documents written by the server.
Constructor Details
#initialize(replies, connection_description = nil) ⇒ Result
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Initialize a new result.
For an unkacknowledged write, pass nil in replies.
For all other operations, replies must be a Protocol::Message instance or an array containing a single Protocol::Message instance.
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/mongo/operation/result.rb', line 90 def initialize(replies, connection_description = nil) if replies if replies.is_a?(Array) if replies.length != 1 raise ArgumentError, "Only one (or zero) reply is supported, given #{replies.length}" end reply = replies.first else reply = replies end unless reply.is_a?(Protocol::Message) raise ArgumentError, "Argument must be a Message instance, but is a #{reply.class}: #{reply.inspect}" end @replies = [ reply ] @connection_description = connection_description end end |
Instance Attribute Details
#connection_description ⇒ Server::Description (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns Server description of the server that the operation was performed on that this result is for.
115 116 117 |
# File 'lib/mongo/operation/result.rb', line 115 def connection_description @connection_description end |
#replies ⇒ Array<Protocol::Message> (readonly)
Returns replies The wrapped wire protocol replies.
109 110 111 |
# File 'lib/mongo/operation/result.rb', line 109 def replies @replies end |
Instance Method Details
#acknowledged? ⇒ true, false
On MongoDB 2.6 and higher all writes are acknowledged since the driver uses write commands for all write operations. On 2.4 and lower, the result is acknowledged if the GLE has been executed after the command. If not, no replies will be specified. Reads will always return true here since a replies is always provided.
Is the result acknowledged?
132 133 134 |
# File 'lib/mongo/operation/result.rb', line 132 def acknowledged? !!@replies end |
#cluster_time ⇒ nil | ClusterTime
Get the cluster time reported in the server response.
Changed in version 2.9.0: This attribute became an instance of ClusterTime, which is a subclass of BSON::Document. Previously it was an instance of BSON::Document.
375 376 377 |
# File 'lib/mongo/operation/result.rb', line 375 def cluster_time first_document && ClusterTime[first_document['$clusterTime']] end |
#cursor_id ⇒ Integer
Cursor ids of 0 indicate there is no cursor on the server.
Get the cursor id if the response is acknowledged.
146 147 148 |
# File 'lib/mongo/operation/result.rb', line 146 def cursor_id acknowledged? ? replies.last.cursor_id : 0 end |
#documents ⇒ Array<BSON::Document>
Get the documents in the result.
168 169 170 171 172 173 174 |
# File 'lib/mongo/operation/result.rb', line 168 def documents if acknowledged? replies.flat_map(&:documents) else [] end end |
#each {|Each| ... } ⇒ Enumerator
Iterate over the documents in the replies.
188 189 190 |
# File 'lib/mongo/operation/result.rb', line 188 def each(&block) documents.each(&block) end |
#error ⇒ Error::OperationFailure
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
The exception instance (of the Error::OperationFailure class) that would be raised during processing of this result.
This method should only be called when result is not successful.
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 |
# File 'lib/mongo/operation/result.rb', line 300 def error @error ||= Error::OperationFailure.new( parser., self, code: parser.code, code_name: parser.code_name, write_concern_error_document: parser.write_concern_error_document, write_concern_error_code: parser.write_concern_error_code, write_concern_error_code_name: parser.write_concern_error_code_name, write_concern_error_labels: parser.write_concern_error_labels, labels: parser.labels, wtimeout: parser.wtimeout, connection_description: connection_description, ) end |
#inspect ⇒ String
Get the pretty formatted inspection of the result.
200 201 202 |
# File 'lib/mongo/operation/result.rb', line 200 def inspect "#<#{self.class.name}:0x#{object_id} documents=#{documents}>" end |
#labels ⇒ Array
Gets the set of error labels associated with the result.
387 388 389 |
# File 'lib/mongo/operation/result.rb', line 387 def labels @labels ||= parser.labels end |
#namespace ⇒ Nil
Get the namespace of the cursor. The method should be defined in result classes where ‘ns’ is in the server response.
156 157 158 |
# File 'lib/mongo/operation/result.rb', line 156 def namespace nil end |
#ok? ⇒ true, false
Check the first document’s ok field.
265 266 267 268 269 270 271 272 |
# File 'lib/mongo/operation/result.rb', line 265 def ok? # first_document[OK] is a float, and the server can return # ok as a BSON int32, BSON int64 or a BSON double. # The number 1 is exactly representable in a float, hence # 1.0 == 1 is going to perform correctly all of the time # (until the server returns something other than 1 for success, that is) first_document[OK] == 1 end |
#operation_time ⇒ Object
Get the operation time reported in the server response.
359 360 361 |
# File 'lib/mongo/operation/result.rb', line 359 def operation_time first_document && first_document[OPERATION_TIME] end |
#reply ⇒ Protocol::Message
Get the reply from the result.
Returns nil if there is no reply (i.e. the operation was an unacknowledged write).
212 213 214 215 216 217 218 |
# File 'lib/mongo/operation/result.rb', line 212 def reply if acknowledged? replies.first else nil end end |
#returned_count ⇒ Integer
Get the count of documents returned by the server.
228 229 230 231 232 233 234 |
# File 'lib/mongo/operation/result.rb', line 228 def returned_count if acknowledged? reply.number_returned else 0 end end |
#successful? ⇒ true, false
If the write was unacknowledged, then this will always return true.
If the result was a command then determine if it was considered a success.
248 249 250 251 252 253 254 255 |
# File 'lib/mongo/operation/result.rb', line 248 def successful? return true if !acknowledged? if first_document.has_key?(OK) ok? && parser..empty? else !query_failure? && parser..empty? end end |
#topology_version ⇒ TopologyVersion | nil
Returns The topology version.
326 327 328 329 330 331 332 |
# File 'lib/mongo/operation/result.rb', line 326 def topology_version unless defined?(@topology_version) @topology_version = first_document['topologyVersion'] && TopologyVersion.new(first_document['topologyVersion']) end @topology_version end |
#validate! ⇒ Result
This only checks for errors with writes since authentication is handled at the connection level and any authentication errors would be raised there, before a Result is ever created.
Validate the result by checking for any errors.
288 289 290 |
# File 'lib/mongo/operation/result.rb', line 288 def validate! !successful? ? raise_operation_failure : self end |
#write_concern_error? ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Whether the operation failed with a write concern error.
394 395 396 |
# File 'lib/mongo/operation/result.rb', line 394 def write_concern_error? !!(first_document && first_document['writeConcernError']) end |
#written_count ⇒ Integer Also known as: n
Get the number of documents written by the server.
342 343 344 345 346 347 348 |
# File 'lib/mongo/operation/result.rb', line 342 def written_count if acknowledged? first_document[N] || 0 else 0 end end |