Erlang 如何使FoldRows()函数中的计数值在CouchDB列表中的函数之外可用?
我有一个用Erlang编写的CouchDB列表,如下代码所示。此列表将输出每行的计数。我需要的是在遍历所有行之后“发送”计数。(仅获取最终计数) 我怎样才能做到这一点?尝试使用ets,但未能成功Erlang 如何使FoldRows()函数中的计数值在CouchDB列表中的函数之外可用?,erlang,couchdb,Erlang,Couchdb,我有一个用Erlang编写的CouchDB列表,如下代码所示。此列表将输出每行的计数。我需要的是在遍历所有行之后“发送”计数。(仅获取最终计数) 我怎样才能做到这一点?尝试使用ets,但未能成功 fun(Head, {Req}) -> Fun = fun({Row}, Acc) -> TheType = proplists:get_value(<<"type">>, element(1,proplists:get_value
fun(Head, {Req}) ->
Fun = fun({Row}, Acc) ->
TheType = proplists:get_value(<<"type">>, element(1,proplists:get_value(<<"value">>,Row))),
case TheType of
<<"TYPEONE">> ->
Count = Acc+1;
_ ->
Count = Acc
end,
Send(list_to_binary(io_lib:format("Count: ~p~n", [Count]))),
{ok, Count}
end,
FoldRows(Fun, 0),
""
end.
fun(Head,{Req})->
乐趣=乐趣({Row},Acc)->
类型=PropList:get_值(,元素(1,PropList:get_值(,行)),
案例类型
->
计数=Acc+1;
_ ->
计数=Acc
完,,
发送(列表到二进制(io库:格式(“计数:~p~n,[Count])),
{好的,伯爵}
完,,
FoldRows(有趣,0),
""
结束。
编写时,此代码无法编译。因此,我猜测了一些要点,并试图回答。但通常在这个论坛上,你应该注意提出明确的问题,尽量少提出公开的观点:
- Head和Req是否未使用
- Send和FoldRows是未定义的变量
- 行具有未定义的格式
Filter = fun({Row},Type) ->
case proplists:get_value(<<"type">>, element(1,proplists:get_value(<<"value">>,Row))) of
Type -> 1;
_ -> 0
end
end,
然后像这样使用它Count(RowList,)
如外壳所示:
27> E1 = {[{foo,0},{<<"value">>,{[{bar,0},{<<"type">>,<<"TYPEONE">>}],baz}}]}.
{[{foo,0},
{<<"value">>,{[{bar,0},{<<"type">>,<<"TYPEONE">>}],baz}}]}
28> E2 = {[{foo,0},{<<"value">>,{[{bar,0},{<<"type">>,<<"TYPETWO">>}],baz}}]}.
{[{foo,0},
{<<"value">>,{[{bar,0},{<<"type">>,<<"TYPETWO">>}],baz}}]}
29> E3 = {[{foo,0},{<<"value">>,{[{bar,0},{<<"notype">>,<<"TYPEONE">>}],baz}}]}.
{[{foo,0},
{<<"value">>,{[{bar,0},{<<"notype">>,<<"TYPEONE">>}],baz}}]}
30> E4 = {[{foo,0},{<<"value">>,{[{bar,0},{<<"type">>,<<"TYPEONE">>}],baz}}]}.
{[{foo,0},
{<<"value">>,{[{bar,0},{<<"type">>,<<"TYPEONE">>}],baz}}]}
31> RowList = [E1,E2,E3,E4].
[{[{foo,0},
{<<"value">>,{[{bar,0},{<<"type">>,<<"TYPEONE">>}],baz}}]},
{[{foo,0},
{<<"value">>,{[{bar,0},{<<"type">>,<<"TYPETWO">>}],baz}}]},
{[{foo,0},
{<<"value">>,{[{bar,0},{<<"notype">>,<<"TYPEONE">>}],baz}}]},
{[{foo,0},
{<<"value">>,{[{bar,0},{<<"type">>,<<"TYPEONE">>}],baz}}]}]
32> Count(RowList,<<"TYPEONE">>).
2
33> Count(RowList,<<"TYPETWO">>).
1
34>
27>E1={[{foo,0},{,{[{bar,0},{,},baz}]}。
{[{foo,0},
{,{[{bar,0},{,},baz}]}
28>E2={[{foo,0},{,{[{bar,0},{,},baz}]}。
{[{foo,0},
{,{[{bar,0},{,},baz}]}
29>E3={[{foo,0},{,{[{bar,0},{,},baz}]}。
{[{foo,0},
{,{[{bar,0},{,},baz}]}
30>E4={[{foo,0},{,{[{bar,0},{,},baz}]}。
{[{foo,0},
{,{[{bar,0},{,},baz}]}
31>行列表=[E1、E2、E3、E4]。
[{{foo,0},
{,{[{bar,0},{,},baz}]},
{[{foo,0},
{,{[{bar,0},{,},baz}]},
{[{foo,0},
{,{[{bar,0},{,},baz}]},
{[{foo,0},
{,{[{bar,0},{,},baz}]}]
32>计数(行列表,)。
2.
33>计数(行列表,)。
1.
34>
以下功能适用于我:-
fun(Head, {Req}) ->
Fun = fun({Row}, Acc) ->
{Val} = couch_util:get_value(<<"value">>, Row, rest),
TheType = proplists:get_value(<<"TheType">>, Val),
case TheType of
<<"TYPEONE">> ->
{ok,Acc+1};
_->
{ok,Acc}
end
end,
{ok, Count} = FoldRows(Fun, 0),
Send(list_to_binary(integer_to_list(Count)))
end.
列表的查看功能如下:-
fun({Doc}) ->
K = proplists:get_value(<<"TheType">>, Doc, null),
Emit(K, {Doc})
end.
fun({Doc})->
K=proplist:get_值(,Doc,null),
发射(K,{Doc})
结束。
非常感谢阿克沙。这正是我问题的解决方案。Pascal,我给出的代码确实不会直接在Erlang shell中运行。但正如我在问题中提到的,这是CouchDB中的一个“列表”函数。因此,当在CouchDB中用作列表时,它将正常运行。无论如何,非常感谢你的回答。你用了一种很容易理解的方式来表达。。
{
"_id": "1fa48be41889b04936c0bf0b570002a2",
"_rev": "1-29eb2f161688277924b6a4a4e7ad7a78",
"TheType": "TYPEONE"
}
fun({Doc}) ->
K = proplists:get_value(<<"TheType">>, Doc, null),
Emit(K, {Doc})
end.