我正在尝试使用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)
对于fun被传递到lists:foreach,你缺少一个右括号,以及一end对case,以及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)。