You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 08:47:40