千家信息网

MongoDB怎样处理批量update违反唯一约束的key

发表于:2025-11-06 作者:千家信息网编辑
千家信息网最后更新 2025年11月06日,MongoDB怎样处理批量update违反唯一约束的key,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。MongoDB批量update一
千家信息网最后更新 2025年11月06日MongoDB怎样处理批量update违反唯一约束的key

MongoDB怎样处理批量update违反唯一约束的key,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

MongoDB批量update一般使用upsert即可,但是这样更新可能会违反唯一建约束导致全部都没有更新(关系型数据库亦是如此),针对这个情况可以一条条更新或者加判断进行更新来保证:不违反唯一约束的行都能得到更新。下面是处理方式,供有需求的人进行参考
【背景说明】

  • 集合名:kk_device_likes_game

  • 唯一索引:{"device_id" : 1,

"target_type" : 1,

"target_id" : 1

}

  • 更新内容为:db.kk_device_likes_game.update({"target_type":5,"target_id":NumberLong(1030)},{"$set":{"target_id":NumberLong(1031)}},true,true)

将满足条件为"target_type":5,"target_id":NumberLong(1030)的target_id键值的NumberLong(1030)改为NumberLong(1031)

更新会失败,因为这个集合更新字段上面有复合唯一索引,使得更新后的键值与已有的其他键值冲突。这样导致能被更新的键值却不能更新。报错如下:

【问题解决】

针对上面情况:有两条思路

  • 方式一:遍历满足条件集合,逐条更新

思路:获取满足条件的键值,遍历其每一个_id进行逐条更新,类似sql为update … where target_type=5 and target_id=1030 and _id =…

语法如下:

var cursor = db.kk_device_likes_game.find({"target_type":5,"target_id":NumberLong(1030)})

while (cursor.hasNext()) {

doc=cursor.next();

a=db.kk_device_likes_game.update({_id:doc._id,"target_type":5,"target_id":NumberLong(1030)},{"$set":{"target_id":NumberLong(1031)}})

print(a)

}

  • 方式二:判断如果会违反约束就不更新该行

思路:获取满足条件的键值,根据复合唯一索引{"device_id" : 1,"target_type" : 1,"target_id" : 1},将device_id值跟条件为 target_type=5 and target_id=1031的 device_id进行比对,如果有一样的device_id则该行不更新。类似sql为update …where target_type=5 and target_id=1030 and device_id not in (select device_id from where target_type=5 and target_id=1031 )

语法如下:

var cursor = db.kk_device_likes_game.find({"target_type":5,"target_id":NumberLong(1030)})

while (cursor.hasNext()) {

doc=cursor.next();

a=db.kk_device_likes_game.find({device_id:doc.device_id,"target_type":5,"target_id":NumberLong(1031)}).count()

if ( a == 0 ){

db.kk_device_likes_game.update({_id:doc._id,"target_type":5,"target_id":NumberLong(1030)},{"$set":{"target_id":NumberLong(1031)}});

}

else {

print("_id:" + doc._id + "违反唯一性约束无法更新" );

}

}

【自我校验】

待更新完后,查看满足更新条件却没更新的条目数 跟 更新后会违反唯一键条目数是否相等,如果相等说明本次更新成功

查看更新会违反唯一约束的条目数:

i=0

var cursor = db.kk_device_likes_game.find({"target_type":5,"target_id":NumberLong(1030)})

while (cursor.hasNext()) {

doc=cursor.next();

a=db.kk_device_likes_game.find({device_id:doc.device_id,"target_type":5,"target_id":NumberLong(1031)}).count()

i=i+a

}

结果为431

查看满足更新条件却没更新的条目数:

db.kk_device_likes_game.find({"target_type":5,"target_id":NumberLong(1030)}).count()

结果为431

二者结果一致,本次更新成功!

看完上述内容,你们掌握MongoDB怎样处理批量update违反唯一约束的key的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

更新 条件 条目 处理 内容 思路 方式 索引 结果 问题 成功 情况 方法 更多 语法 逐条 一致 束手无策 为此 原因 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 昌平区网络技术咨询报价 手机服务器配置参数怎么看 安装用友t6 显示数据库 温州网络技术服务咨询 网络安全保卫 会议 网络安全宣传周开幕式实况 网站部署到服务器上怎么进行加密 数据库文件的逻辑名称 分散式数据库 成都极视互联网科技有限公司 测试服务器端口的速度 福福家软件技术软件开发中心 腾鹰网络技术 仿真实训软件开发计划 广东本地软件开发市场价 网络安全专业就业前途如何 廊坊软件开发有哪些公司 校长指导学校网络安全教育 宣城安卓软件开发定制公司 手机应用 服务器 网网络安全手抄报的字 自考数据库原理与数据库系统原理 公安机关应如何维护网络安全 无线网络安全向导怎么打开 ctd数据库富集分析 计算机网络技术需要学的英语 阴阳师不同服务器怎么换账号 网络安全员笔试考题 2ksports的服务器合法吗 北京程序软件开发品牌企业
0