MongoDB为对象数组添加派生字段问题求助
解决MongoDB数组元素添加字段并复制现有字段值的问题
你的问题出在更新语句里直接把字符串"profiles.$[].value"赋值给了adjustedValue,这只会把这个字符串本身存进去,而不是引用对应元素的value字段值。MongoDB的普通$set操作符没法直接引用同文档内的字段值来赋值,得用聚合管道式更新来实现(MongoDB 4.2及以上版本支持)。
正确的更新语句如下:
db.collection.update( { "profiles.adjustedValue": { $exists: false } }, [ { $set: { profiles: { $map: { input: "$profiles", as: "p", in: { $mergeObjects: [ "$$p", { adjustedValue: "$$p.value", adjustmentReason: "n/a" } ] } } } } } ], { multi: true } )
代码说明:
- 查询条件用
{ "profiles.adjustedValue": { $exists: false } },精准匹配那些还没添加adjustedValue字段的文档,避免重复更新 - 用
$map遍历profiles数组的每个元素(用$$p指代当前元素) $mergeObjects把原元素的所有字段(name、value)和新添加的两个字段合并,既保留原有数据,又完成字段添加和值复制
如果你的MongoDB版本低于4.2,只能通过遍历文档逐个处理,示例如下:
db.collection.find({ "profiles.adjustedValue": { $exists: false } }).forEach(doc => { doc.profiles.forEach(profile => { profile.adjustedValue = profile.value; profile.adjustmentReason = "n/a"; }); db.collection.save(doc); });
内容的提问来源于stack exchange,提问作者herme 0
相关产品推荐
相关产品推荐

