diff --git a/bson/bsoncodec/default_value_decoders.go b/bson/bsoncodec/default_value_decoders.go index 0402265d93..18919e3c40 100644 --- a/bson/bsoncodec/default_value_decoders.go +++ b/bson/bsoncodec/default_value_decoders.go @@ -718,6 +718,7 @@ func (dvd DefaultValueDecoders) UndefinedDecodeValue(dc DecodeContext, vr bsonrw return nil } +// Accept both 12-byte string and pretty-printed 24-byte hex string formats. func (dvd DefaultValueDecoders) objectIDDecodeType(dc DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) { if t != tOID { return emptyValue, ValueDecoderError{ @@ -740,6 +741,9 @@ func (dvd DefaultValueDecoders) objectIDDecodeType(dc DecodeContext, vr bsonrw.V if err != nil { return emptyValue, err } + if oid, err = primitive.ObjectIDFromHex(str); err == nil { + break + } if len(str) != 12 { return emptyValue, fmt.Errorf("an ObjectID string must be exactly 12 bytes long (got %v)", len(str)) } diff --git a/bson/bsoncodec/default_value_decoders_test.go b/bson/bsoncodec/default_value_decoders_test.go index b7fc2b5636..c1a0f6e0d9 100644 --- a/bson/bsoncodec/default_value_decoders_test.go +++ b/bson/bsoncodec/default_value_decoders_test.go @@ -1118,6 +1118,17 @@ func TestDefaultValueDecoders(t *testing.T) { bsonrwtest.ReadString, nil, }, + { + "success/string-hex", + primitive.ObjectID{0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62}, + nil, + &bsonrwtest.ValueReaderWriter{ + BSONType: bsontype.String, + Return: "303132333435363738396162", + }, + bsonrwtest.ReadString, + nil, + }, { "decode null", primitive.ObjectID{},