在Erlang的帮助下在CouchDB中创建视图

Shi*_*ary 1 erlang

我正在尝试使用erlang语言在CouchDB中创建一个视图文档。我已在配置中启用了erlang query_server。当我创建文档时,将语言设置为javascript,如果我转到设计文档并将其更改为erlang,则会从CouchDB中收到错误消息。

fun({Doc}) ->
    case proplists:get_value(<<"type">>, Doc) of
    undefined ->
        ok;
    Type ->
        Identifiers = proplists:get_value(<<"institution">>, Doc),
        lists:foreach(fun(Doc) 
        -> 
        Emit(doc._id,Doc);
    _ ->
        ok
    end.
Run Code Online (Sandbox Code Playgroud)

发现的错误是:

Error running query. Reason: ({badmatch,[<<"error">>, {9,erl_parse,["syntax error before: ","'.'"]}, {9,erl_parse,["syntax error before: ","'.'"]}]}) [{couch_query_servers,'-start_doc_map/3-fun-0-',2, [{file,"src/couch_query_servers.erl"},{line,62}]}, {lists,foreach,2,[{file,"lists.erl"},{line,1337}]}, {couch_query_servers,start_doc_map,3, [{file,"src/couch_query_servers.erl"},{line,61}]}, {couch_mrview_updater,start_query_server,1, [{file,"src/couch_mrview_updater.erl"},{line,231}]}, {couch_mrview_updater,map_docs,2, [{file,"src/couch_mrview_updater.erl"},{line,184}]}]
Run Code Online (Sandbox Code Playgroud)

leg*_*cia 5

对于fun被传递到lists:foreach,你缺少一个右括号,以及一endcase,以及end用于封闭fun。同样,lists:foreach将要操作的列表作为第二个参数。尝试这个:

fun({Doc}) ->
        case proplists:get_value(<<"type">>, Doc) of
            undefined ->
                ok;
            Type ->
                Identifiers = proplists:get_value(<<"institution">>, Doc),
                lists:foreach(fun(Doc) ->
                                      Emit(doc._id,Doc);
                                 _ ->
                                      ok
                              end,
                              Identifiers) % ? add argument and closing parenthesis here 
        end % ? add 'end' for 'case' here
end. % ? add 'end' for 'fun' here
Run Code Online (Sandbox Code Playgroud)

我不确定Emit(doc._id,Doc)。由于Emit以大写字母开头,因此它是指变量,但此处没有Emit变量-CouchDB是否以某种方式使该变量可用?也doc._id就是无效的Erlang语法; 我想应该是proplists:get_value(<<"_id">>, Doc)