kettle经验篇:MongoDB-delete插件问题

目录

项目场景

问题分析

解决方案

MongoDB Delete插件使用总结


项目场景

项目使用的ODS层数据库是MongoDB;在数据中心从DB层向ODS层同步数据过程中,发现有张ODS表在同步过程中,数据突然发生锐减,甚至于该ODS表数据清0。

同步技术使用的是kettle,在该ODS表的同步转换中,只有两个控件用来处理MongDB数据:一个是kettle本身自带的MongoDB output,一个是使用的插件MongoDB Delete。

MongoDB Delete删除是按照条件删除MongoDB数据库中指定集合的数据,此转换是有两个条件:一个常量,一个主键ID。

 

kettle的MongoDB Delete 插件资源在我的资源列表中,需要的可以去下载。

问题分析

从项目场景来分析,ODS表数据锐减,甚至清0。很明显是有删除操作导致的,而kettle转换中有删除MongoDB数据功能的控件只有MongoDB Delete。

所以现在怀疑大概率是MongoDB Delete插件存在bug。

锁定了MongoDB Delete后,在转换中加了【调试】日志,想要看下同步过程中到底发生了什么。

以下是对项目上的ETL转换的日志分析 【为避免项目隐私,关键内容已打马塞克】

1、项目场景中的ETL转换中涉及MongoDB Delete的日志片段

这里的逻辑撤销删除就是在转换中给MongoDB Delete插件定义的名字;

由项目场景中的介绍已知,删除条件是两个,但这里只有一个条件;

且这里的删除条件是个常量,按照此条件删除,肯定是大批量的删了;

2、为什么删除条件变成一个了呢?

根据日志的上下内容,发现该条数据中的ID为空,经过测试发现:

当两个条件中的某个字段为NULL时,

MongoDB Delete插件就会只按照不NULL的那个字段进行查询删除。

3、两个字段都不为NULL时的正常日志片段

4、当只有一个条件,且为NULL时的日志

此时发现查询条件中什么也没有,而测试结果却是将对应的MongoDB集合数据全部删除了。

5、当将过滤空值时的日志

此时发现MongoDB Delete插件不会产生任何的查询删除操作

解决方案

在MongoDB Delete插件前加个非空过滤,即可解决该问题。经过测试,ODS数据锐减问题解决。

 

MongoDB Delete插件使用总结

经过上述的日志分析,可以将MongoDB Delete的使用总结为以下几点:

  • 当删除条件为单个时

如果条件字段为NULL,则删除全表,相当于Oracle中的truncate。

  • 当删除条件为多个时

如果某个条件字段为NULL,此时删除条件减1,按照非NULL的字段进行删除;如果这多个字段全部为NULL,则删除全表,相当于Oracle中的truncate。

  • 非空过滤

在使用MongoDB Delete插件时,应该将删除用到条件字段全部进行非空过滤,不让空值流下去,才能保障数据不会因BUG删除。

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜豆豆耶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值