Erlang Mnesia Select结果与read、foldl不同

Erlang Mnesia Select结果与read、foldl不同,erlang,mnesia,Erlang,Mnesia,我有3个用例用于从mnesia表返回数据 1.返回表的所有值,因此我使用foldl, 2.返回1行,以便我使用read 3.根据条件返回可变数量的记录,因此我使用select 我希望使用相同的代码来管理结果,但是select返回不同的数据结构。我希望有人能帮助我重组我的选择,以返回与其他人一样 下面是问题的示例代码和结果。问题是select不像read和foldl那样返回表的记录名 -module(testselect2). -export([runtest/0]). -record(rec

我有3个用例用于从mnesia表返回数据 1.返回表的所有值,因此我使用foldl, 2.返回1行,以便我使用read 3.根据条件返回可变数量的记录,因此我使用select

我希望使用相同的代码来管理结果,但是select返回不同的数据结构。我希望有人能帮助我重组我的选择,以返回与其他人一样

下面是问题的示例代码和结果。问题是select不像read和foldl那样返回表的记录名

-module(testselect2).

-export([runtest/0]).

-record(record_a, {b, c, d}).
-record(record_b, {record_a, e}).
-record(record_c, {record_b, f, intval}).
runtest() ->
mnesia:create_schema([node()]),
mnesia:start(),
mnesia:create_table(record_c, [{attributes, record_info(fields, record_c)}]),

A1 = #record_a{b = "R1", c = "T1", d = "C1"},
B1 = #record_b{record_a = A1, e = "E1"},
C1 = #record_c{record_b = B1, f = "F1", intval = 100},    

A2 = #record_a{b = "R2", c = "T2", d = "C2"},
B2 = #record_b{record_a = A2, e = "E2"},
C2 = #record_c{record_b = B2, f = "F2", intval = 200},    

A3 = #record_a{b = "R3", c = "T3", d = "C3"},
B3 = #record_b{record_a = A3, e = "E3"},
C3 = #record_c{record_b = B3, f = "F3", intval = 300},    

{atomic, Rw} = mnesia:transaction(
              fun () ->
                mnesia:write(C1),
                mnesia:write(C2),
                mnesia:write(C3)                    
              end),


io:fwrite("Result write = ~w~n", [Rw]),   

{atomic, Rr} = mnesia:transaction(
              fun () ->
                      mnesia:read({record_c, B1})

              end),
io:fwrite("Result read = ~w~n", [Rr]),   

{atomic, Rf} =
           mnesia:transaction(fun () ->
                                      mnesia:foldl(fun (Rec, Acc) -> [Rec | Acc] end,
                                                   [],
                                                   record_c)
                              end),
io:fwrite("Result foldl = ~w~n", [Rf]),                                         

MatchHead = #record_c{record_b='$1', f='$2',  intval='$3'},
Guard = {'>', '$3', 100},
Result = {{'$1', '$2', '$3'}}, 
{atomic, Rs} = mnesia:transaction(
              fun () ->  
                  mnesia:select(record_c, [{MatchHead, [Guard], [Result]}])
              end),
io:fwrite("Result select = ~w~n", [Rs]).  
===== 结果

44>testselect2:runtest()

结果写入=正常

结果读取=[{record_c,{record_b,{record_a[82,49],[84,49],[67,49]}[69,49]}[70,49],100}]

结果foldl=[{record_c,{record_b,{record_a[82,49],[84,49],[67,49],[69,49],[70,49],[70,49],100},{record_c,{record_b,{record_a[82,51],[84,51],[67,51],[69,51],[70,51],[300},{record_c,{record_b,{record_a[82,50],[84,50],[67,50],[67,50],[200}]

结果选择=[{record_b,{record_a[82,51],[84,51],[67,51],[69,51],[70,51],300},{record_b,{record_a[82,50],[84,50],[67,50],[69,50],[70,50],200}]

好啊 正如您在上面看到的,read和foldl记录以{record_c,{…开头,其中select缺少记录{u c,只有{


我一直无法找到一种方法让select返回相同的结构,这样我的处理代码就可以适用于所有3个用例。任何建议都将不胜感激。

我不是记忆专家,但我知道当您使用ETS匹配表达式时,您可以确定结果是什么样的。您可以使用
result={{'$1','$2','$3'}
创建结果项,这使它们成为一个元组中的三个元组,正如我们在输出中看到的那样。根据,您希望使用特殊变量
'$\u'
返回整个匹配的对象,因此这应该代替
结果=…
行:

Result = '$_',

谢谢你这么做了!我真的很感谢你的快速回复。@Gregg np。如果你的答案在SO上解决了你的问题,你会想把它标记为“已接受”和/或向上投票,以帮助未来的用户找到好的答案。