如何按mnesia:match_object函数返回的id对对象进行分组

时间:2017-01-14 14:22:45

标签: erlang mnesia

我需要通过sender_id对mnesia记录进行分组,这是记录:

-record(pm,{sender_id, recipient_id, msg, time}).

基本上我需要获取recipient_id=X的所有记录并按sender_id

分组

最快的方法是什么?

我认为情况是显而易见的。

1 个答案:

答案 0 :(得分:2)

有几种方法可以解决这个问题。

获取结果并按发件人ID排序

这是迄今为止最简单的解决方案。只需像往常一样获得结果(记录列表),然后通过sender_id获取sort the records

lists:sort(fun(A, B) ->
    A#pm.sender_id < B#pm.sender_id
end, Results).

使用qlc:fold / 3

这有点复杂,但使用普通的lists:sort/2似乎更优雅。而不是返回一个列表,它返回一个字典。

select_grouped_pms_for_recipient(RecipientId) ->
    Q = qlc:q([E || E <- mnesia:table(pm), E#pm.recipient_id == RecipientId]),
    qlc:fold(fun group/2, dict:new(), Q).

group(Record, Acc) ->
    dict:append(Record#pm.sender_id, Record, Acc).

group/2函数中,我们将记录推送到dict累加器中的发件人ID值列表。 select_grouped_pms_for_recipient/1将返回包含在发件人ID密钥下分组的所有记录的结果dict

Erlang邮件列表是一个很好的问题和答案的宝库。我在邮件列表上找到了this question,这与您的问题非常相似。

哪个更快?

看看这些解决方案,我不确定性能会有很大差异。我想它们大致相同,但是对于qlc,在为所接收的每个项目执行所有分组逻辑期间保持锁定,因此它可以将Mnesia锁定保持更长时间。