如何将MongoDB中的元组进行转换
{'_id',<<"vasya">>,password,<<"12ghd">>,age,undefined}
转换为属性列表
[{'_id',<<"vasya">>},{password,<<"12ghd">>},{age,undefined}]
如何将MongoDB中的元组进行转换
{'_id',<<"vasya">>,password,<<"12ghd">>,age,undefined}
转换为属性列表
[{'_id',<<"vasya">>},{password,<<"12ghd">>},{age,undefined}]
element\2
从元组中提取元素,使用tuple_size\1
获取元组的大小。以下是处理此操作的几种方式:1> Tup = {'_id',<<"vasya">>,password,<<"12ghd">>,age,undefined}.
{'_id',<<"vasya">>,password,<<"12ghd">>,age,undefined}
2> Size = tuple_size(Tup).
6
3> [{element(X, Tup), element(X+1, Tup)} || X <- lists:seq(1, Size, 2)].
[{'_id',<<"vasya">>},{password,<<"12ghd">>},{age,undefined}]
或者你可以将其压缩:
4> lists:zip([element(X, Tup) || X <- lists:seq(1, Size, 2)], [element(X, Tup) || X <- lists:seq(2, Size, 2)]).
[{'_id',<<"vasya">>},{password,<<"12ghd">>},{age,undefined}]
slice(Tuple, Start, Stop, Step) ->
[element(N, Tuple) || N <- lists:seq(Start, Stop, Step)].
5> lists:zip(slice(Tup, 1, Size, 2), Slice(Tup, 2, Size, 2)).
[{'_id',<<"vasya">>},{password,<<"12ghd">>},{age,undefined}]
或者你可以编写一个简单的函数来完成它:
mongo_to_proplist(MongoTuple) ->
mongo_to_tuple(MongoTuple, 1, tuple_size(MongoTuple)).
mongo_to_proplist(Mt, I, Size) when I =:= Size -> [];
mongo_to_proplist(Mt, I, Size) ->
Key = element(I, Mt),
Val = element(I+1, Mt),
[{Key,Val}|mongo_to_proplist(Mt, I+2, Size)].
这基本上就是列表推导式版本所做的事情,但展开成了显式循环。
虽然不是很高效,所以不要在大型结构上使用它,但确实非常简单:
to_proplist(Tuple) -> to_proplist1(tuple_to_list(Tuple), []).
to_proplist1([], Acc) -> Acc;
to_proplist1([Key, Value | T], Acc) -> to_proplist1(T, [{Key, Value} | Acc]).
to_proplist_([]) -> []; to_proplist_([K, V | T]) -> [{K,V} | to_proplist_(T)].
这种递归方式,因为现在这种递归已经足够快了,而且元组已经有了有限的大小。 - Hynek -Pichi- Vychodil