123456789_123456789_123456789_123456789_123456789_

Class: Mongo::Error::BulkWriteError

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Error
Instance Chain:
self, Error
Inherits: Error
  • Object
Defined in: lib/mongo/error/bulk_write_error.rb

Overview

Note:

A bulk operation that resulted in a BulkWriteError may have written some of the documents to the database. If the bulk write was unordered, writes may have also continued past the write that produced a BulkWriteError.

Exception raised if there are write errors upon executing a bulk operation.

Unlike OperationFailure, BulkWriteError does not currently expose individual error components (such as the error code). The result document (which can be obtained using the #result attribute) provides detailed error information and can be examined by the application if desired.

Since:

  • 2.0.0

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(result, server_addresses: nil) ⇒ BulkWriteError

Instantiate the new exception.

Examples:

Instantiate the exception.

Mongo::Error::BulkWriteError.new(response)

Parameters:

  • result (Hash)

    A processed response from the server reporting results of the operation.

  • server_addresses (Array<String | Mongo::Address | Mongo::Server::Description>)

    Addresses of the servers that produced this error. Entries are normalized to "host:port" strings.

Since:

  • 2.0.0

[ GitHub ]

  
# File 'lib/mongo/error/bulk_write_error.rb', line 54

def initialize(result, server_addresses: nil)
  @result = result
  @server_addresses = normalize_server_addresses(server_addresses)

  # Exception constructor behaves differently for a nil argument and
  # for no argument. Avoid passing nil explicitly.
  message = build_message
  message ? super(message) : super()
end

Instance Attribute Details

#resultBSON::Document (readonly)

Returns:

  • (BSON::Document)

    result The error result.

Since:

  • 2.0.0

[ GitHub ]

  
# File 'lib/mongo/error/bulk_write_error.rb', line 35

attr_reader :result

#server_addressesArray<String> (readonly)

Returns:

  • (Array<String>)

    Deduplicated list of "host:port" addresses of the servers that produced this bulk write error. Empty when no addresses were supplied.

Since:

  • 2.0.0

[ GitHub ]

  
# File 'lib/mongo/error/bulk_write_error.rb', line 40

attr_reader :server_addresses

Instance Method Details

#build_messageString (private)

Generates an error message when there are multiple write errors.

col has validation { 'validator' => { 'x' => { '$type' => 'string' } } } col.insert_many([1, 2], ordered: false)

Multiple errors:

[121]: Document failed validation --
{"failingDocumentId":1,"details":{"operatorName":"$type",
"specifiedAs":{"x":{"$type":"string"}},"reason":"field was
missing"}};
[121]: Document failed validation --
{"failingDocumentId":2, "details":{"operatorName":"$type",
"specifiedAs":{"x":{"$type":"string"}}, "reason":"field was
missing"}}

Examples:

Multiple documents fail validation

Returns:

  • (String)

    The error message

Since:

  • 2.0.0

[ GitHub ]

  
# File 'lib/mongo/error/bulk_write_error.rb', line 84

def build_message
  errors = @result['writeErrors']
  return nil unless errors

  fragment = ''
  cut_short = false
  errors.first(10).each_with_index do |error, i|
    fragment += '; ' if fragment.length > 0
    fragment += "[#{error['code']}]: #{error['errmsg']}"
    fragment += " -- #{error['errInfo'].to_json}" if error['errInfo']

    if fragment.length > 3000
      cut_short = i < [ 9, errors.length ].min
      break
    end
  end

  fragment += '...' if errors.length > 10 || cut_short

  fragment = "Multiple errors: #{fragment}" if errors.length > 1

  if Mongo.include_server_address_in_errors && @server_addresses.any?
    fragment = "#{fragment} (on #{@server_addresses.join(', ')})"
  end

  fragment
end

#normalize_server_addresses(value) (private)

Since:

  • 2.0.0

[ GitHub ]

  
# File 'lib/mongo/error/bulk_write_error.rb', line 112

def normalize_server_addresses(value)
  return [] if value.nil?

  Array(value).filter_map do |entry|
    case entry
    when String then entry
    when Mongo::Address then entry.seed
    when Mongo::Server::Description then entry.address&.seed
    else
      raise ArgumentError,
            "server_addresses entries must be String, Mongo::Address, or Mongo::Server::Description; got #{entry.class}"
    end
  end.uniq
end