Erlang 如何根据mnesia:match_object函数返回的id对对象进行分组
我需要按发件人id对mnesia记录进行分组,以下是记录:Erlang 如何根据mnesia:match_object函数返回的id对对象进行分组,erlang,mnesia,Erlang,Mnesia,我需要按发件人id对mnesia记录进行分组,以下是记录: -record(pm,{sender_id, recipient_id, msg, time}). 基本上,我需要获取所有recipient\u id=X的记录,并按sender\u id 最快的方法是什么 我认为情况是显而易见的。有几种方法可以解决这个问题 获取结果并按发件人id对其进行排序 这是迄今为止最简单的解决方案。只需按照您通常的方式和发件人id获取结果(记录列表): lists:sort(fun(A, B) ->
-record(pm,{sender_id, recipient_id, msg, time}).
基本上,我需要获取所有recipient\u id=X
的记录,并按sender\u id
最快的方法是什么
我认为情况是显而易见的。有几种方法可以解决这个问题 获取结果并按发件人id对其进行排序 这是迄今为止最简单的解决方案。只需按照您通常的方式和发件人id获取结果(记录列表):
lists:sort(fun(A, B) ->
A#pm.sender_id < B#pm.sender_id
end, Results).
在group/2
函数中,我们将记录推送到dict
累加器中的发送者ID值列表中。select\u grouped\u pms\u for\u recipient/1
将返回结果dict
,其中包含按发件人ID键分组的所有记录的列表
Erlang邮件列表是一个很好的问题和答案的宝库。我在邮件列表上找到了,这与你的问题非常相似
哪个更快?
看看这些解决方案,我不确定性能是否会有很大差异。我想它们大致相同,但对于qlc,锁在所有分组逻辑执行期间都会被保留,因此它可能会保留Mnesia锁一段时间。您使用的是什么版本的Erlang?
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).