MongoDB如何修改文档数组内对象的key2字段为目标结构
MongoDB数组结构更新方案
你需要通过数组遍历重构的方式完成字段改写,以下是不同版本的实现方案:
方案1:MongoDB 4.2及以上版本(原子操作,生产环境推荐)
该版本支持聚合管道式更新,无需读取文档到客户端修改,直接在数据库侧完成原子更新:
db.collection.updateMany( // 可在此处添加筛选条件,空对象代表匹配集合内所有文档 {}, [ { $set: { myArray: { $map: { input: "$myArray", as: "item", in: { // 保留原有需要的字段 Key1: "$$item.Key1", // 提取嵌套的entry值作为新字段 key2Modified: "$$item.key2.entry" } } } } } ] )
如果数组元素中除了Key1还有大量其他字段需要保留,可以不用逐个列字段,用下面的写法自动保留原有字段后删除旧的key2:
db.collection.updateMany( {}, [ { $set: { // 批量给数组每个元素新增key2Modified字段 "myArray.key2Modified": { $map: { input: "$myArray", in: "$$this.key2.entry" } } } }, { // 移除数组所有元素的旧key2字段 $unset: "myArray.key2" } ] )
方案2:MongoDB 4.2以下版本
低版本不支持聚合管道更新,需要先读取文档到客户端修改后再写回:
db.collection.find({ // 可在此处添加筛选条件 }).forEach(doc => { // 遍历数组修改每个元素 doc.myArray = doc.myArray.map(item => { item.key2Modified = item.key2.entry; delete item.key2; return item; }); // 保存修改后的文档 db.collection.save(doc); })
注意:该方案为非原子操作,并发写入场景下可能出现数据覆盖问题,生产环境建议升级到4.2以上版本使用方案1。
内容的提问来源于stack exchange,提问作者user3548905
相关产品推荐
相关产品推荐

