如何使用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
相关产品推荐
相关产品推荐

