如何按 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 锁定更长的时间。