最近在一次任务中需要批量修改mongodb中的一些旧数据。任务需求是A表之前与B表的关联是通过创建部门来进行文字匹配的这样在一些操作中比如部门名称改变的话就会导致数据不匹配。 为了保证后续数据的一致性与简洁性。就让2表进行关联,但是问题在于A和B表之间是没有主键关联的。而且上面也不允许使用程序语言来解决,必须是用脚本来操作。但是在mobgodb 中关联查询本就是弱项,自己对这方面也没有什么研究。但是任务下来了,没办法只能上了。
后面再研究mongodb 时,开始是想用lookup来操作的 但是发现这个也只是说可以关联表查询,但是却不能操作,对lookup有兴趣的朋友可以看我的上一个博文https://blog.youkuaiyun.com/HiBoyljw/article/details/86540255。
最后研究了一下发现mongodb中还有一个foreach函数,这是相当于使用脚本的方式对表进行操作。话不多说,直接上代码来看吧
//在函数中依然可以调用
var param = db.sm_pm_paramconfig.find({
paramGroup: "BUSINESSUNIT"
});
//对信息表进行遍历操作
db.userinfo.find().forEach(function(item) {
var arr = item.address.split("_");
//获取部门名称
var deptName = "";
var num = -1;
for (var i = 0; i < arr.length; i++) {
if ("****" == arr[i]) {
num = i;
break;
}
}
if (num >= 0) {
deptName = arr[num + 1];
} else {
deptName = "****";
}
//插入ID
//注意:param获取的对象要toarray一下才能遍历。
var config = param.toArray();
for (var j = 0, len = config.length; j < len; j++) {
if (deptName == config[j].paramValue) {
//插入新字段
db.userinfo.update({
"_id": item._id
}, {
$set: {
"businessUnitId": config[j]._id
}
});
break;
}
}
})
mongodb 这种脚本方式就像是在写js语句一样,所以也都很好理解。很多复杂的操作都能通过这种方式来实现。以上就是本文的全部内容,希望对各位有些帮助。