如何在match_object命令中使用list:member(user,users)?? 我有几条记录,其中“users”是一个包含不同用户的列表,我想显示包含某个用户的记录。
find(User) ->
mnesia:transaction(fun () ->
case mnesia:match_object(#updt{**users==[User]**, _='_'}) of
[Y] ->io:format("Records found for the user : ~p~n", [Y]);
[] -> io:format("No group found with the user : ~p ~n",[User])
end
end).`
答案 0 :(得分:0)
基本上你在mnesia:match_object/1
中所做的是提供匹配的模式,不多也不少。在模式中,您只能匹配数据,不能指定对函数的调用。由于erlang没有patten数据类型,我们通过提供一个被解释为模式的结构来伪造它。
不幸的是,使用mnesia:select/2
无效。虽然匹配规范有一个"后卫"你只被允许在其中做一些典型的保护,并且不允许调用一般功能。
请注意,mnesia:match_object/1
和mnesia:select/2
都会返回匹配的整个对象。
答案 1 :(得分:0)
我看到了两个解决问题的方法:
使用
mensia:foldl(fun({updt,I,L},Acc) ->
case lists:member(User,L) of
true -> [I|Acc];
_ -> Acc
end,[],Table)
或维护第二个记录您需要的表格({new_table,User,[I ...]})
您应该根据更新请求的频率,查询请求,表的大小以及是否存在并发访问来选择。
答案 2 :(得分:0)
您不必使用match_object。我已经回答了类似的问题:
[已回答的问题] [1] https://stackoverflow.com/a/28762454/
基本上,您可以使用我在答案问题中指定的方法查询数据库,就像使用SQL DB一样。您可以使用list:member / 2来查找匹配项。