Erlang 如何使FoldRows()函数中的计数值在CouchDB列表中的函数之外可用?

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

我有一个用Erlang编写的CouchDB列表,如下代码所示。此列表将输出每行的计数。我需要的是在遍历所有行之后“发送”计数。(仅获取最终计数)

我怎样才能做到这一点?尝试使用ets,但未能成功

    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是未定义的变量
  • 行具有未定义的格式
不过我可以给你一些线索

定义一个筛选函数,如果行符合您的条件,则返回1,否则返回0:

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.