Mongo Shell中用现有字段值新增字段时$foo被识别为字面量问题
解决MongoDB中用现有字段值新增字段的问题
嘿,我太懂你这个困扰了!你遇到的问题核心在于:传统的update命令里,$set直接写'$foo'会被当成普通字符串字面量,而不是引用现有字段的值。要实现把现有字段的值复制到新字段,得用MongoDB的聚合管道更新功能,或者针对老版本用遍历的方式,下面给你详细说:
方法一:使用聚合管道更新(MongoDB 4.2+ 推荐)
从MongoDB 4.2开始,支持用聚合管道作为更新操作的参数,这时候$set里的$foo会被正确解析为对现有foo字段的引用。你可以用updateMany(或者update加multi: true)来批量更新所有文档:
db.coll.updateMany( {}, // 空查询条件匹配所有文档 [ { $set: { foo_new: "$foo" } } // 聚合管道中的$set会识别字段引用 ] )
或者如果你习惯用update,也可以这么写:
db.coll.update( {}, [ { $set: { foo_new: "$foo" } } ], { multi: true } )
执行完这个命令后,再查询集合里的文档:
db.coll.find()
就能看到每个文档都变成了{ 'foo': 'str1', 'foo_new': 'str1' }和{ 'foo': 'str2', 'foo_new': 'str2' },完全符合你的需求!
方法二:针对MongoDB 4.2以下版本(遍历更新)
如果你用的是4.2之前的老版本,不支持聚合管道更新,那就只能通过遍历每个文档的方式来手动更新:
db.coll.find().forEach(function(doc) { db.coll.updateOne( { _id: doc._id }, // 通过_id精准匹配单个文档 { $set: { foo_new: doc.foo } } // 直接用当前文档的foo字段值 ) })
这种方式虽然能实现需求,但效率不如聚合管道,适合小数据量的集合。
内容的提问来源于stack exchange,提问作者John S.
相关产品推荐
相关产品推荐

