Search code examples
mongodbobjectmongooseinsert-update

mongoose overriding original object instead of updating


I have something like this:

  pinnedKpi: {
    Ver01: { type: Array },
    Ver02: { type: Array },
    Ver03: { type: Array },
    Ver04: { type: Array }
  },

when I update this object, on say the Ver01 key i get something like this back:

 pinnedKpi: {
         Ver01: [1,2,3,4],
      } 

it overrides the entire data structure, and now I can't access my other VerX keys

Here is my update code

 app.post('/savePinned', (req, res) => {
  User.findOneAndUpdate(
    { email: req.body.email },
    {
      $set: {
        pinnedKpi: { [`Ver0${req.body.kpiVersion}`]: req.body.pinnedKpi }
      }
    },
    { upsert: true, new: true },
    function(err, user) {
      if (err) console.log('error saving pinned kpi', err);
      res.send(user.pinnedKpi[`Ver0${req.body.kpiVersion}`]);
    }
  );
});

I have tried it with only upsert:true, only new:true, and niether option.. It still won't update just one key.


Solution

  • Use this:

      app.post('/savePinned', (req, res) => {
      User.findOneAndUpdate(
        { email: req.body.email },
        {
          $set: {
            ["pinnedKpi.Ver0"+req.body.kpiVersion]: req.body.pinnedKpi
          }
        },
        { upsert: true, new: true },
        function(err, user) {
          if (err) console.log('error saving pinned kpi', err);
          res.send(user.pinnedKpi[`Ver0${req.body.kpiVersion}`]);
        }
      );
    });