erlang bson

bson是binary json的缩写,可以把它看做是键值对的组合,主要在mongodb做数据存储时用到,看了下Git上有人用erlang写了个bson,学习一下写法。

%% 这个函数时用来查找filed所对应的index的
find(Label, Doc) -> findN(Label, Doc, 0, tuple_size(Doc) div 2).
findN(Label, Doc, High, High) -> {};
findN(Label, Doc, Low, High) ->
	case element(Low *2 +1 ,Doc) of
		Label -> Low; %%这个地方找到了对应的Key,返回此Key对应的Index
		AtomKey when is_atom(AtomKey) ->
			case atom_to_bianry(AtomKey, utf8) =:= Label of
				true -> Low;
				false -> findN(Label, Doc, Low + 1, High)
			end;
		_ -> findN(Label, Doc, Low + 1, Hight)
	end.

lookup(Label, Doc) ->
	lookup(Label, Doc, []).
lookup(Label, Doc, Default) when is_atom(Label) ->
	lookup(atom_to_binary(Label, utf8), Doc, Default);%%这个地方不用utf8编码也是可以的,因为当前erlang的atom范围完全够Latin编码,但是为了之后的使用,还是用的utf8
lookup(Label, Doc, Default) ->
	Parts = binary:split(Label, <<".">>, []),
	case length(Parts) of
	1 ->
		lookup(Parts, Doc, fun(Index) -> element(Index * 2 + 2, Doc) end, Default);%%当只有一个元素时,直接找Value中对应的元素就可以了。
	_ ->
		lookup(Parts, Doc, fun(Index) -> lookup(hd(tl(Parts)), element(Index * 2 + 2, Doc) end, Default) end, Deafault)%%当元素不止一个时,递归寻找
	end. 

%% 如果找到了对应的Index就执行Fun函数
lookup(Parts, Doc, GetFun, Default) ->
	case find(hd(Parts), Doc) of
		{} -> Default;
		Index -> GetFun(Index)
	end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值