MongoDB:如何用聚合管道整体覆盖数组字段而非元素
解决MongoDB聚合管道更新时数组转对象的覆盖问题
当你使用聚合管道的$set直接给数组字段赋值对象时,MongoDB会默认将该对象应用到数组的每一个元素上,导致出现[ { foo: 43 }, { foo: 43 } ]这种不符合预期的结果。要一步完成数组到对象的替换,只需用$literal运算符包裹你要设置的对象,强制MongoDB将其视为字段的完整新值而非数组元素的更新内容。
正确的更新语句如下:
db.collection.update({}, [ { "$set": { key: { "$literal": { foo: 43 } } } } ], { multi: true })
$literal的作用是返回指定的字面量值,不会对其进行任何解析或转换,这样就能彻底替换原有的数组字段为目标对象,无需先删除字段再更新。
内容的提问来源于stack exchange,提问作者Minh Nghĩa
相关产品推荐
相关产品推荐

