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

如何使用MongoDB updateOne更新数组内对象中的指定值

解决MongoDB updateOne更新数组内指定对象属性的语法问题

模型结构

你的MongoDB模型中数组字段定义如下:

nombre:{type:String},
MaterialesProductos:[{
  Descripcion:{type:String},
  cantidad:{type:Number},
  codigo:{type:String},
  preciounitario:{type:Number},
  familia:{type:String}
}]

现有插入数据方式

你当前用$push插入数组元素的代码:

await Producto.updateOne(
  {nombre:req.body.ProductoAEditar}, 
  { $push: {MaterialesProductos: {cantidad:req.body['MaterialesProductos[cantidad]'][a]}}});

需求:更新指定codigo的数组对象属性

你需要用$set更新MaterialesProductos数组中codigo匹配的对象的cantidad字段,以下是两种正确的实现方案:

方案1:匹配第一个符合条件的数组元素

使用数组定位符$,可以定位查询条件中第一个匹配的数组元素:

await Producto.updateOne(
  {
    nombre: req.body.ProductoAEditar,
    "MaterialesProductos.codigo": req.body['MaterialesProductos[codigo]'][a]
  },
  {
    $set: { "MaterialesProductos.$.cantidad": req.body['MaterialesProductos[cantidad]'][a] }
  }
);

方案2:匹配所有符合条件的数组元素

如果需要更新数组中所有匹配codigo的元素(MongoDB 3.6及以上版本支持),可以用过滤数组更新操作符$[<identifier>]:

await Producto.updateOne(
  { nombre: req.body.ProductoAEditar },
  {
    $set: { "MaterialesProductos.$[elem].cantidad": req.body['MaterialesProductos[cantidad]'][a] }
  },
  {
    arrayFilters: [{ "elem.codigo": req.body['MaterialesProductos[codigo]'][a] }]
  }
);

原代码错误原因

你之前的写法存在两个核心问题:

  • 直接写MaterialesProductos:{codigo:...}会替换整个数组,而非定位到目标元素
  • $set的路径没有指向数组内的具体属性,缺少数组元素的定位标识

数据存储示例

你的Mongo Atlas中数据结构如下:

nombre:"Aaron",
MaterialesProductos: [
  {
    Descripcion: "Angulo 1/8\" x 1 1/4\" de 6.10 mts. (1.50 kg/mt)",
    cantidad:0,
    codigo:"AA-03",
    preciounitario:260.84,
    familia:"Aceros"
  }
]

内容的提问来源于stack exchange,提问作者Aaron Rodriguez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:11:14