gpt4 book ai didi

erlang - 从CouchDB中的Erlang View 发射元组

转载 作者:行者123 更新时间:2023-12-04 03:17:35 25 4
gpt4 key购买 nike

使用 native erlang View 的CouchDB版本0.10.0。

我有一个格式简单的文档:

{
"_id": "user-1",
"_rev": "1-9ccf63b66b62d15d75daa211c5a7fb0d",
"type": "user",
"identifiers": [
"ABC",
"DEF",
"123"
],
"username": "monkey",
"name": "Monkey Man"
}

和一个基本的javascript设计文档:
{
"_id": "_design/user",
"_rev": "1-94bd8a0dbce5e2efd699d17acea1db0b",
"language": "javascript",
"views": {
"find_by_identifier": {
"map": "function(doc) {
if (doc.type == 'user') {
doc.identifiers.forEach(function(identifier) {
emit(identifier, {\"username\":doc.username,\"name\":doc.name});
});
}
}"
}
}
}

发出:
{"total_rows":3,"offset":0,"rows":[
{"id":"user-1","key":"ABC","value":{"username":"monkey","name":"Monkey Man"}},
{"id":"user-1","key":"DEF","value":{"username":"monkey","name":"Monkey Man"}},
{"id":"user-1","key":"123","value":{"username":"monkey","name":"Monkey Man"}}
]}

我正在考虑建立一个做同样的事情的Erlang View 。到目前为止,最佳尝试是:
%% Map Function
fun({Doc}) ->
case proplists:get_value(<<"type">>, Doc) of
undefined ->
ok;
Type ->
Identifiers = proplists:get_value(<<"identifiers">>, Doc),
ID = proplists:get_value(<<"_id">>, Doc),
Username = proplists:get_value(<<"username">>, Doc),
Name = proplists:get_value(<<"name">>, Doc),
lists:foreach(fun(Identifier) -> Emit(Identifier, [ID, Username, Name]) end, Identifiers);
_ ->
ok
end
end.

发出:
{"total_rows":3,"offset":0,"rows":[
{"id":"user-1","key":"ABC","value":["monkey","Monkey Man"]},
{"id":"user-1","key":"DEF","value":["monkey","Monkey Man"]},
{"id":"user-1","key":"123","value":["monkey","Monkey Man"]}
]}

问题是-如何将这些值作为元组而不是数组?我不认为我可以(或想要)使用记录,但是在元组中使用原子似乎不起作用。
lists:foreach(fun(Identifier) -> Emit(Identifier, {id, ID, username, Username, name, Name}) end, Identifiers);

失败,并出现以下错误:
{"error":"json_encode","reason":"{bad_term,{<<\"user-1\">>,<<\"monkey\">>,<<\"Monkey Man\">>}}"}

有什么想法吗?我知道Erlang很喜欢这种特定的东西(命名访问),并且我可以按照约定(在第一个位置ID,下一个用户名,最后一个实名)进行操作,但这使客户端代码非常难看。

最佳答案

JSON对象{"foo":"bar","baz":1}{[{<<"foo">>,<<"bar">>},{<<"baz">>,1}]}
在Erlang语言中,它是一个封装在元组中的属性列表。

它不是很漂亮,但是非常有效:)

要感受一下,您可以使用CouchDB附带的JSON库:

  • 使用-i启动CouchDB
    (交互式)标志
  • 在生成的erlang shell上,键入:couch_util:json_decode(<<"{\"foo\":\"bar\"}">>).
  • 利润

  • //在更高版本的CouchDB中,这是 ejson:decode()

    关于erlang - 从CouchDB中的Erlang View 发射元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2414811/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com