如何按 mnesia:match_object 函数返回的 id 对对象进行分组
How to group objects by id returned by mnesia:match_object function
我需要按 sender_id 对 mnesia 记录进行分组,这是记录:
-record(pm,{sender_id, recipient_id, msg, time}).
基本上我需要获取 recipient_id=X
的所有记录并按 sender_id
对它们进行分组
最快的方法是什么?
我认为情况很明显。
有几种方法可以解决这个问题。
获取结果并按sender_id
排序
这是迄今为止最简单的解决方案。像往常一样获取结果(记录列表),然后 sort the records by sender_id:
lists:sort(fun(A, B) ->
A#pm.sender_id < B#pm.sender_id
end, Results).
使用qlc:fold/3
这有点复杂,但使用普通的旧 lists:sort/2
看起来确实更优雅一些。 return 不是列表,而是 return 字典。
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
将 return 结果 dict
包含在发件人 ID 键下分组的所有记录的列表。
Erlang 邮件列表是很好的问题和答案的宝库。我在邮件列表中找到了 this question,这与您的问题非常相似。
哪个更快?
查看这些解决方案,我不确定性能会有很大差异。我想它们大致相同,但是对于 qlc,在对接收到的每个项目执行所有分组逻辑期间会保持锁定,因此它可能会保持 Mnesia 锁定更长的时间。
我需要按 sender_id 对 mnesia 记录进行分组,这是记录:
-record(pm,{sender_id, recipient_id, msg, time}).
基本上我需要获取 recipient_id=X
的所有记录并按 sender_id
最快的方法是什么?
我认为情况很明显。
有几种方法可以解决这个问题。
获取结果并按sender_id
排序这是迄今为止最简单的解决方案。像往常一样获取结果(记录列表),然后 sort the records by sender_id:
lists:sort(fun(A, B) ->
A#pm.sender_id < B#pm.sender_id
end, Results).
使用qlc:fold/3
这有点复杂,但使用普通的旧 lists:sort/2
看起来确实更优雅一些。 return 不是列表,而是 return 字典。
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
将 return 结果 dict
包含在发件人 ID 键下分组的所有记录的列表。
Erlang 邮件列表是很好的问题和答案的宝库。我在邮件列表中找到了 this question,这与您的问题非常相似。
哪个更快?
查看这些解决方案,我不确定性能会有很大差异。我想它们大致相同,但是对于 qlc,在对接收到的每个项目执行所有分组逻辑期间会保持锁定,因此它可能会保持 Mnesia 锁定更长的时间。