High-performance BSON encoder/decoder for Erlang.
- Zero-copy traversal - Navigate BSON documents without decoding values
- Efficient skipping - Skip entire subtrees using BSON length prefixes
- Memory safe - All decoded values are copied to avoid retaining source binaries
- Full type support - All common BSON types including decimal128
Add to your rebar.config:
{deps, [
{ebson, "0.1.0"}
]}.Map = #{
<<"_id">> => {objectid, <<1,2,3,4,5,6,7,8,9,10,11,12>>},
<<"name">> => <<"Alice">>,
<<"age">> => 30,
<<"tags">> => [<<"developer">>, <<"erlang">>]
},
{ok, Bson} = ebson:encode_map(Map).{ok, Map} = ebson:decode_map(Bson).%% Create iterator
{ok, Iter} = ebson_iter:new(Bson),
%% Iterate elements
{ok, Key, Type, ValueRef, Iter2} = ebson_iter:next(Iter),
%% Decode only when needed
{ok, Value} = ebson_iter:decode_value(Type, ValueRef).%% Find a top-level key
{ok, Type, ValueRef} = ebson_iter:peek(Bson, <<"name">>),
{ok, <<"Alice">>} = ebson_iter:decode_value(Type, ValueRef).
%% Navigate nested paths
{ok, Type, ValueRef} = ebson_iter:find_path(Bson, [<<"address">>, <<"city">>]).Zero-copy BSON binary iterator for hot paths. Use this when you need to:
- Filter documents without full decode
- Access specific fields efficiently
- Skip large nested structures
Convenience encode/decode for Erlang maps. Use this when you need to:
- Fully decode documents for processing
- Encode Erlang maps for storage
- Work with documents in admin tools or tests
| Erlang Value | BSON Type |
|---|---|
integer (32-bit range) |
int32 |
integer (64-bit range) |
int64 |
float |
double |
binary |
string (UTF-8) |
true / false |
boolean |
null |
null |
map |
document |
list |
array |
{objectid, <<12 bytes>>} |
objectid |
{datetime_ms, Integer} |
datetime |
{binary, Subtype, Data} |
binary |
{timestamp, Increment, Time} |
timestamp |
{decimal128, Coeff, Exp} |
decimal128 |
{regex, Pattern, Options} |
regex |
minkey / maxkey |
minkey / maxkey |
ValueRefs from ebson_iter point into the original binary without copying. This is efficient but means the source binary stays in memory.
To release the source binary:
- Call
ebson_iter:decode_value/2which usesbinary:copy/1 - Use
ebson:decode_map/1for full document decode
Apache-2.0