Mnesia迭代:提供一组函数来迭代表里的所有记录,firecat实践

简介: Mnesia迭代:提供一组函数来迭代表里的所有记录,firecat实践

1、Mnesia提供了如下几个函数遍历所有记录


mnesia:foldl(Fun, Acc0, Tab) -> NewAcc | transaction abort
     mnesia:foldr(Fun, Acc0, Tab) -> NewAcc | transaction abort
     mnesia:foldl(Fun, Acc0, Tab, LockType) -> NewAcc | transaction abort
     mnesia:foldr(Fun, Acc0, Tab, LockType) -> NewAcc | transaction abort

这些函数会将Fun遍历应用到表Tab表上,并把结构放入累计集Acc0中,可以按需要指定锁类型。Fun有两个参数,第一个是从表中取出的记录,第二个是累计集。


例如要查找薪资级别在10以下的员工:

find_low_salaries() ->
     Constraint = 
          fun(Emp, Acc) when Emp#employee.salary < 10 ->
                 [Emp | Acc];
               (_, Acc) ->
                    Acc
             end,
        Find = fun() -> mnesia:foldl(Constraint, [], employee) end,
        mnesia:transaction(Find)


将薪资上调到10级,返回所有涨薪和:

increase_low_salaries() ->
         Increase = 
             fun(Emp, Acc) when Emp#employee.salary < 10 ->
                    OldS = Emp#employee.salary,
                    ok = mnesia:write(Emp#employee{salary = 10}),
                    Acc + 10 - OldS;
                (_, Acc) ->
                    Acc
             end,
        IncLow = fun() -> mnesia:foldl(Increase, 0, employee, write) end,
        mnesia:transaction(IncLow).

 

在遍历中可以做很多事情,但是要特别留意性能和内存消耗。



2、firecat的实践一,查询数据库表的某一列,并求和

get_onlinenum(<<"ALL_DEVICES">>) -> Mnesia迭代求和
    Sum =
  fun(Emp, Acc) when Emp#?ONLINE_TAB.onlinenum /= 0 ->
  V = Emp#?ONLINE_TAB.onlinenum,
        Acc + V;
  (_, Acc) ->
  Acc
  end,
    Find = fun() -> mnesia:foldl(Sum, 0, ?ONLINE_TAB) end,
    mnesia:transaction(Find);
(test@192.168.83.128)1> test:get_onlinenum(<<"ALL_DEVICES">>).
{atomic,2}


其中,{atomic,2}里面的2就是返回结果。


实践二,修改数据


clear_onlinenum() ->
    Clear =
  fun(Emp, Acc) when Emp#?ONLINE_TAB.onlinenum /= 0 ->
    ok = mnesia:write(Emp#?ONLINE_TAB{onlinenum = 0});
    (_, Acc) ->
    Acc
  end,
    Find = fun() -> mnesia:foldl(Clear, [], ?ONLINE_TAB) end,
    ret(mnesia:transaction(Find)).


相关文章
|
3月前
|
存储 数据安全/隐私保护
8、软件配置管理过程——所有表集合
8、软件配置管理过程——所有表集合
38 0
|
25天前
【全网最简短代码】筛选出新数组中和旧数组的重复项,并和旧数组合并(往数组追加新的数据对象且去重,合并两个数组不重复数据)
【全网最简短代码】筛选出新数组中和旧数组的重复项,并和旧数组合并(往数组追加新的数据对象且去重,合并两个数组不重复数据)
|
4月前
|
分布式计算 Java Hadoop
MapReduce编程:检索特定群体搜索记录和定义分片操作
MapReduce编程:检索特定群体搜索记录和定义分片操作
29 0
|
7月前
|
存储 程序员 C语言
c++ 如何做出实现一组数据的实际索引
c++ 如何做出实现一组数据的实际索引
|
11月前
|
存储 程序员 C语言
c++ 如何做出实现一组数据的实际索引
C++是一种计算机高级程序设计语言, 由​​C语言​​​扩展升级而产生 , 最早于1979年由​​本贾尼·斯特劳斯特卢普​​在AT&T贝尔工
|
12月前
|
缓存 自然语言处理 数据挖掘
白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理
白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理
78 0
|
SQL 移动开发 BI
【SQL开发实战技巧】系列(二十三):数仓报表场景☞ 如何对数据排列组合去重以及通过如何找到包含最大值和最小值的记录这个问题再次用执行计划给你证明分析函数性能不一定高
怎样对数据组合重新排列并去重的问题、通过如何找到包含最大值和最小值的记录这个问题再次用执行计划给你证明分析函数性能不一定高【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。本篇文章主要介绍的两个方面,第一个方面曾经有好几个网友和同事问我,第二个问题真的是很多同行的通病,认为分析函数是万金油,一股脑用。
【SQL开发实战技巧】系列(二十三):数仓报表场景☞ 如何对数据排列组合去重以及通过如何找到包含最大值和最小值的记录这个问题再次用执行计划给你证明分析函数性能不一定高
|
索引 Python
python 对一组list数据,进行区间划分,按照大小排序并返回索引值
最近在对海洋数据进行处理时,对数据需要进行一些排序,数据匹配等操作; 现对我所希望实现的一些函数进行总结:
python 对一组list数据,进行区间划分,按照大小排序并返回索引值
|
Java 数据挖掘 索引
【python数据分析】数据索引的创建,取值,排序
文章目录 索引的创建,取值,排序 1.多层索引的创建 2.多层索引的取值
【python数据分析】数据索引的创建,取值,排序
|
数据管理 Java 大数据
R 高级数据管理—重复和循环、条件执行、转置| 学习笔记
快速学习 R 高级数据管理—重复和循环、条件执行、转置
164 0