使用runCommand执行update时$set无法复制字段值到新属性的问题
问题原因与解决方法
你当前的写法问题在于,直接在$set的嵌套对象里使用$username、$password这种字段引用时,MongoDB会把它们当成普通字符串字面量处理,而不是解析为文档中已有的字段值。要实现引用现有字段构建新对象的需求,必须使用聚合管道形式的更新操作,这是MongoDB 4.2及以上版本支持的特性。
正确的runCommand更新命令如下:
{ "update": "dummyCollection", "updates": [ { "q": { "username": { "$exists": true }, "password": { "$exists": true } }, "u": [ { "$set": { "users.dummyUser": { "username": "$username", "password": "$password" } } } ], "multi": true } ] }
关键修改点:
- 把原来
u字段的对象值改成一个聚合管道数组,数组里包含$set聚合阶段 - 在聚合管道的
$set中,$username和$password会被正确解析为当前文档对应字段的实际值,而不是字符串字面量
这样执行后,就能将每个符合条件的文档里的username和password值,正确填充到users.dummyUser对象中。
内容的提问来源于stack exchange,提问作者KrisKris1
相关产品推荐
相关产品推荐

