Search code examples
javascriptnode.jsarraysmongodbmongoose

How should I updateOne a value inside an object inside an array?


I'm struggling with the syntaxis to updateOne a specified value inside an object inside an array. This is my array of objects from my model

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

This is how I insert values

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

But I would like to $set for example: Producto.updateOne({"name:req.body.nameOfTheDocument", {InThisObject:{WhereCode:req.body.code},$set:{value:req.body.NewValue}});

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

This is how my data looks in my mongo atlas

nombre:"Aaron",
MaterialesProductos: Array
0:Object
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"

Solution

  • I think you want to use arrayfilters:

    db.collection.updateOne({
      nombre: "Aaron"
    },
    {
      $set: {
        "MaterialesProductos.$[item]": {
          Descripcion: "Angulo 1/8 x 1 1/4 de 6.10 mts. (1.50 kg/mt)",
          cantidad: 7,
          codigo: "AA-03",
          preciounitario: 460.84,
          familia: "Aceros"
        }
      }
    },
    {
      arrayFilters: [
        {
          "item.codigo": "AA-03"
        }
      ]
    })
    

    See how it works on the playground example