Laravel MongoDB:如何保留原有数据更新damages对象
在Laravel中给MongoDB嵌套对象添加属性而不覆盖原有数据
嘿,我懂你碰到的问题了——你之前的代码直接把整个damages字段替换掉了,所以原来的1和7对应的结构都没了。这是因为当你在update里直接设置"damages"时,MongoDB会用你提供的新对象完全覆盖掉原来的damages对象。
要实现保留原有数据同时新增属性,你需要用到MongoDB的$set操作符,它可以精准地更新嵌套对象里的特定字段,而不会影响其他已存在的内容。
正确的实现代码
DB::connection($this->mongoCon) ->collection($this->table) ->where(['vehicle_component_id' => (int) $vehicleComponentId]) ->update([ '$set' => [ 'damages.6' => [ 'upper_bound' => [null], 'damages' => ['2'], 'lower_bound' => [null] ] ] ]);
代码说明
$set是MongoDB的核心更新操作符之一,它的作用是只更新或创建指定的字段,不会改动其他已存在的字段。- 这里我们用
damages.6的写法来定位嵌套对象damages下的6属性,如果这个属性不存在,MongoDB会自动创建它;如果存在,则会更新它的内容。 - 这样执行后,原来的
1和7对应的结构会完整保留,同时新增6的属性结构。
扩展:同时添加多个属性
如果你需要一次性给damages添加多个新属性,只需要在$set里添加多个键值对即可:
DB::connection($this->mongoCon) ->collection($this->table) ->where(['vehicle_component_id' => (int) $vehicleComponentId]) ->update([ '$set' => [ 'damages.6' => [ 'upper_bound' => [null], 'damages' => ['2'], 'lower_bound' => [null] ], 'damages.8' => [ 'upper_bound' => [100], 'damages' => ['5'], 'lower_bound' => [50] ] ] ]);
内容的提问来源于stack exchange,提问作者Fadi
相关产品推荐
相关产品推荐

