MongoDB实现数组对象不存在则新增、存在则更新(匹配指定company)
MongoDB数组元素的Upsert操作(匹配指定company文档)
嘿,我来帮你搞定这个数组元素的新增/更新需求!你原来的命令只能实现“不存在就新增”,没法处理已存在元素的更新,而且也没覆盖所有company: 'ABC'的文档,咱们来调整一下:
核心思路
我们需要分两步处理,确保覆盖所有场景:
- 更新已存在的元素:找到所有
company: 'ABC'且数组中已有目标name的文档,更新对应元素的字段 - 新增不存在的元素:找到所有
company: 'ABC'且数组中没有目标name的文档,把新元素加入数组
分步执行命令
1. 更新已存在的元素(比如更新nick的options为8)
db.coll.updateMany( { company: 'ABC', 'profile_set.name': 'nick' }, { $set: { 'profile_set.$.options': 8 } } )
updateMany:确保匹配所有company: 'ABC'的文档'profile_set.name': 'nick':筛选出数组中已有nick的文档$set: { 'profile_set.$.options': 8 }:用位置操作符$定位到数组中匹配的元素,精准更新它的options字段
2. 新增不存在的元素(比如添加matt的信息)
db.coll.updateMany( { company: 'ABC', 'profile_set.name': { $ne: 'matt' } }, { $push: { profile_set: { name: 'matt', options: 0 } } } )
$ne: 'matt':筛选出数组中没有matt的文档$push:把新的对象添加到profile_set数组末尾
高效批量执行(一次完成更新+新增)
如果想把两个操作合并成一次执行,用bulkWrite更高效,减少数据库交互次数:
db.coll.bulkWrite([ // 先更新已存在的nick { updateMany: { filter: { company: 'ABC', 'profile_set.name': 'nick' }, update: { $set: { 'profile_set.$.options': 8 } } } }, // 再新增不存在的nick { updateMany: { filter: { company: 'ABC', 'profile_set.name': { $ne: 'nick' } }, update: { $push: { profile_set: { name: 'nick', options: 8 } } } } } ])
这样就能完美实现你要的效果:不管是已有name的更新,还是新name的新增,都能覆盖到所有company: 'ABC'的文档啦!
内容的提问来源于stack exchange,提问作者jacky
相关产品推荐
相关产品推荐

