千家信息网

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

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,MongoDB怎样处理批量update违反唯一约束的key,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。MongoDB批量update一
千家信息网最后更新 2026年10月31日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安全错误 数据库的锁怎样保障安全 耶加雪菲 百单网互联网科技有限公司 云信互联网科技有限公司 科技创新与互联网经济 互联网核心科技是什么 深圳艾佳互联网科技 老年人脱离互联网科技的作文 阿里互联网科技公司 茂名市互联网科技产业园 互联网软件和科技 湖北码尼互联网科技有限公司电话 彤创互联网科技有限公司 黑科技闪耀互联网之光 江苏苏星互联网科技有限公司 云南省自由互联网科技有限公司 35岁以上互联网科技行业 互联网高科技行业有哪些企业 科技互联网专业工作会议发言稿 长沙易易互联网科技有限公司 互联网科技自媒体灵感 美国互联网保险保险科技 未来的互联网科技 互联网科技热点资讯 北京华百购互联网科技有限公司 受益于互联网科技的高速发展 苏州五指互联网络科技有限 互联网公司高科技产品 保山互联网科技靠谱吗 中国互联网公司的科技投入 如何强化互联网金融科技
0