module BSON::Hash

Injects behaviour for encoding and decoding hashes to and from raw bytes as specified by the BSON spec.

@see bsonspec.org/#/specification

@since 2.0.0

Constants

BSON_TYPE

A hash, also called an embedded document, is type 0x03 in the BSON spec.

@since 2.0.0

Public Instance Methods

as_extended_json(**options) click to toggle source

Converts this object to a representation directly serializable to Extended JSON (github.com/mongodb/specifications/blob/master/source/extended-json.rst).

This method recursively invokes as_extended_json with the provided options on each hash value.

@option opts [ nil | :relaxed | :legacy ] :mode Serialization mode

(default is canonical extended JSON)

@return [ Hash ] This hash converted to extended json representation.

# File lib/bson/hash.rb, line 91
def as_extended_json(**options)
  transform_values { |value| value.as_extended_json(**options) }
end
to_bson(buffer = ByteBuffer.new, validating_keys = Config.validating_keys?) click to toggle source

Get the hash as encoded BSON.

@example Get the hash as encoded BSON.

{ "field" => "value" }.to_bson

@return [ BSON::ByteBuffer ] The buffer with the encoded object.

@see bsonspec.org/#/specification

@since 2.0.0

# File lib/bson/hash.rb, line 41
def to_bson(buffer = ByteBuffer.new, validating_keys = Config.validating_keys?)
  if buffer.respond_to?(:put_hash)
    buffer.put_hash(self, validating_keys)
  else
    position = buffer.length
    buffer.put_int32(0)
    each do |field, value|
      unless value.respond_to?(:bson_type)
        raise Error::UnserializableClass, "Hash value for key '#{field}' does not define its BSON serialized type: #{value}"
      end
      buffer.put_byte(value.bson_type)
      key = field.to_bson_key(validating_keys)
      begin
        buffer.put_cstring(key)
      rescue ArgumentError => e
        raise ArgumentError, "Error serializing key #{key}: #{e.class}: #{e}"
      rescue EncodingError => e
        # Note this may convert exception class from a subclass of
        # EncodingError to EncodingError itself
        raise EncodingError, "Error serializing key #{key}: #{e.class}: #{e}"
      end
      value.to_bson(buffer, validating_keys)
    end
    buffer.put_byte(NULL_BYTE)
    buffer.replace_int32(position, buffer.length - position)
  end
end
to_bson_normalized_value() click to toggle source

Converts the hash to a normalized value in a BSON document.

@example Convert the hash to a normalized value.

hash.to_bson_normalized_value

@return [ BSON::Document ] The normalized hash.

@since 3.0.0

# File lib/bson/hash.rb, line 77
def to_bson_normalized_value
  Document.new(self)
end