MongoDB数据库清洗——根据两字段比对结果查询并更新结果集

1 背景

        由于某些原因,上线新功能时-支持多数据中心(各数据中心的数据会双向同步),为了方便,更新数据库脚本写的过于简单,导致整个库部分数据洗脏。

数据库object表数据片段:

表简要说明:

sourceName数据中心来源标识,由数据库同步中间件打标识。

dataCenterId数据中心标识,有业务层落库,说明业务操作所在的数据中心。

_idsourceNamedataCenterId
abc123xxx01area01:cccd1811ed9161c94c7e05b7bb01master
abc123xxx02master:cccd1811ed9161c94c7e05b7bb02master
abc123xxx03master:cccd1811ed9161c94c7e05b7bb03master
......

执行的SQL:

db.getCollection("object").update({}, {$set: {"dataCenterId": "master"}},false,true);

以上SQL将表中标红的数据更新为master,而正确的值应该为area01。

2 目的

        根据sourceName的前缀更新dataCenterId,以达到清洗目的。

3 解决办法

db.object.find({$where:function () {
	    var result = this.sourceName.startsWith(this.dataCenterId);
		if(result){
		    return false;
		}else{
			return true;
		}
	}
}).forEach(function(item) {
    var arr = item.sourceName.split(':');
	const newValue = arr[0];
    item.dataCenterId = newValue;

    db.object.save(item);
});

清洗后的object表数据片段:

_idsourceNamedataCenterId
abc123xxx01area01:cccd1811ed9161c94c7e05b7bb01area01
abc123xxx02master:cccd1811ed9161c94c7e05b7bb02master
abc123xxx03master:cccd1811ed9161c94c7e05b7bb03master
......

5 注意

        $where操作符功能强大而且灵活,上述数据库清洗过程可以完美说明灵活这一点。他可以使用任意的JavaScript作为查询的一部分,包含JavaScript表达式的字符串或者JavaScript函数。

        非常必要时,建议避免使用"$Where"査询,每个文档都要从BSON转换成JavaScript对象,然后通过"$where"的表达式来运行,还不能利用索引。因此它们在速度上要比常规査询慢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值