显示列表中具有特定元素的所有记录
Display all records with a certain element in lists
如何在match_object命令中使用lists: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).`
基本上,您在 mnesia:match_object/1
中所做的就是提供匹配模式,不多也不少。并且在模式中你只能匹配数据而不能指定对函数的调用。由于 erlang 没有 patten 数据类型,我们通过提供一个被解释为模式的结构来伪造它。
不幸的是,使用 mnesia:select/2
在这里无济于事。虽然匹配规范有 "guard",但您只能在其中执行典型的保护操作,而不允许调用通用函数。
请注意 mnesia:match_object/1
和 mnesia:select/2
return 匹配的整个对象。
我看到有 2 个选项可以解决您的问题:
使用
mensia:foldl(fun({updt,I,L},Acc) ->
case lists:member(User,L) of
true -> [I|Acc];
_ -> Acc
end,[],Table)
或维护第二个 table 记录您需要的内容 ({new_table,User,[I...]})
你应该根据更新请求的频率、查询请求、table的大小以及是否有并发访问来选择。
您不必使用 match_object。我回答过类似的问题:
[已回答问题][1]
基本上,您可以使用我在已回答问题中指定的方法查询数据库,就像使用 SQL 数据库一样。您可以使用列表:member/2 查找匹配项。
如何在match_object命令中使用lists: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).`
基本上,您在 mnesia:match_object/1
中所做的就是提供匹配模式,不多也不少。并且在模式中你只能匹配数据而不能指定对函数的调用。由于 erlang 没有 patten 数据类型,我们通过提供一个被解释为模式的结构来伪造它。
不幸的是,使用 mnesia:select/2
在这里无济于事。虽然匹配规范有 "guard",但您只能在其中执行典型的保护操作,而不允许调用通用函数。
请注意 mnesia:match_object/1
和 mnesia:select/2
return 匹配的整个对象。
我看到有 2 个选项可以解决您的问题:
使用
mensia:foldl(fun({updt,I,L},Acc) ->
case lists:member(User,L) of
true -> [I|Acc];
_ -> Acc
end,[],Table)
或维护第二个 table 记录您需要的内容 ({new_table,User,[I...]})
你应该根据更新请求的频率、查询请求、table的大小以及是否有并发访问来选择。
您不必使用 match_object。我回答过类似的问题:
[已回答问题][1]
基本上,您可以使用我在已回答问题中指定的方法查询数据库,就像使用 SQL 数据库一样。您可以使用列表:member/2 查找匹配项。