【问题标题】:Display all records with a certain element in lists显示列表中具有特定元素的所有记录
【发布时间】:2015-02-28 02:22:50
【问题描述】:

如何在match_object命令中使用lists:member(User,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 中是什么样的?我不能从这段代码中看出很多,但我不确定你为什么不使用mnesia:read/1?你能展示一下这个表是如何创建的吗?
  • {atomic,[{updt,7,["ret"]}, {updt,6,["aas"]}, {updt,4,["adlf"]}, {updt ,1,["adlf","lojer","iowef"]}, {updt,2,["sfdgbs","5rf","grwg","irg"]}, {updt,3,["adlf "]}, {updt,5,["aas"]}]} 所以基本上我希望它显示表中包含例如 "adlf" 的条目,所以它应该能够显示第 1 行、第 3 行, 4

标签: list erlang


【解决方案1】:

您不必使用 match_object。我已经回答了一个类似的问题:

[已回答的问题][1]https://stackoverflow.com/a/28762454/

基本上,您可以使用我在已回答问题中指定的方法查询数据库,就像使用 SQL DB 一样。您可以使用 lists:member/2 来查找匹配项。

【讨论】:

    【解决方案2】:

    基本上,您在mnesia:match_object/1 中所做的是提供一个匹配的模式,不多不少。在模式中,您只能匹配数据,而不能指定对函数的调用。由于 erlang 没有模式数据类型,我们通过提供一个被解释为模式的结构来伪造它。

    很遗憾,在这里使用mnesia:select/2 无济于事。虽然匹配规范有一个“守卫”,但您只能在其中做典型的守卫事情,并且不允许调用通用函数。

    请注意,mnesia:match_object/1mnesia:select/2 都返回匹配的整个对象。

    【讨论】:

      【解决方案3】:

      我看到 2 个选项可以解决您的问题:

      使用

      mensia:foldl(fun({updt,I,L},Acc) -> 
                      case lists:member(User,L) of
                          true -> [I|Acc];
                          _ -> Acc
                      end,[],Table)
      

      或维护第二张表来记录您需要的内容 ({new_table,User,[I...]})

      您应该根据更新请求的频率、查询请求、表的大小以及是否有并发访问来选择。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-01
        • 2013-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多