MongoDB批量更新数组元素:复制Name字段至SPOSegment字段
MongoDB批量更新数组元素新增字段的解决方案
你的查询语法存在问题,updateMany的第一个参数应为文档过滤条件,第二个参数才是具体的更新操作逻辑。针对你的需求,分两种版本给出可行方案:
方案一:MongoDB 4.2+ 版本(推荐)
利用聚合管道实现数组元素的批量修改,写法如下:
db.collection.updateMany( // 筛选包含目标数组的文档,避免无效更新 { "WorkspacePartTeamsite.SiteContents": { $exists: true, $type: "array" } }, [ { $set: { "WorkspacePartTeamsite.SiteContents": { $map: { input: "$WorkspacePartTeamsite.SiteContents", as: "item", in: { $mergeObjects: [ "$$item", { SPOSegment: "$$item.Name" } ] } } } } } ] )
逻辑说明:
- 用
$map遍历原数组的每个元素 - 通过
$mergeObjects将原元素对象与新增的SPOSegment字段合并 - 最后用
$set替换整个数组完成更新
方案二:MongoDB 3.6~4.0 版本
若你的MongoDB版本不支持聚合管道更新,可使用arrayFilters实现:
db.collection.updateMany( { "WorkspacePartTeamsite.SiteContents": { $exists: true, $type: "array" } }, { $set: { "WorkspacePartTeamsite.SiteContents.$[elem].SPOSegment": "$WorkspacePartTeamsite.SiteContents.$[elem].Name" } }, { arrayFilters: [ { "elem.Name": { $exists: true } } ] } )
逻辑说明:
arrayFilters指定匹配规则,仅对存在Name字段的数组元素生效- 通过
$[elem]占位符定位到每个符合条件的元素,直接赋值SPOSegment字段
内容的提问来源于stack exchange,提问作者David Mason
相关产品推荐
相关产品推荐

