遍历映射列表排查ID不匹配记录及字段添加插入技术指导请求
实现指引与方法建议
原始数据结构
[ "node_name": [ %{ id: "e5016e16-3e35-4241-9cba-aa3c428f17c5", # 其他字段 }, %{ id: "773c8dbe-954f-42a1-a72a-045f25d0cd8c", # 其他字段 } ], "node_2_name": [ %{ other_id: "773c8dbe-954f-42a1-a72a-045f25d0cd8b", id: 1, # 其他字段 }, %{ id: 2, other_id: "e5016e16-3e35-4241-9cba-aa3c428f17c5", # 其他字段 } ] ]
第一步:构建高效查找的ID集合
先把两个节点的关键ID提取为集合(集合的查找效率远高于列表):
- 从
"node_name"列表中提取所有id值,用Enum.map/2配合Map.get/2拿到所有ID,再通过MapSet.new/1转为集合 - 从
"node_2_name"列表中提取所有other_id值,同样转为集合
第二步:筛选两类不匹配记录
筛选node_2_name中other_id无匹配的记录
用Enum.filter/2遍历"node_2_name"的每条记录,判断条件为该记录的other_id不在node_name的ID集合中,用MapSet.member?/2快速完成判断
筛选node_name中id无匹配的记录
同样用Enum.filter/2遍历"node_name"的每条记录,判断条件为该记录的id不在node_2_name的other_id集合中
第三步:补充字段并插入应用
- 对筛选出的不匹配记录,用
Map.merge/2或Map.put/3添加name、surname等字段(前者适合批量合并字段映射,后者适合单个字段添加) - 插入应用时,根据你使用的数据库工具(比如Ecto),选择对应的插入函数:单条记录用
Repo.insert/1,批量插入用Repo.insert_all/3
核心函数参考
Enum.map/2:提取字段、转换记录结构Enum.filter/2:按条件筛选记录MapSet.new/1、MapSet.member?/2:高效的集合创建与查找Map.merge/2、Map.put/3:给映射添加新字段- 数据库操作:
Repo.insert/1、Repo.insert_all/3(Ecto环境下)
内容的提问来源于stack exchange,提问作者Kacper Wielki
相关产品推荐
相关产品推荐

