猫鼬覆盖原始对象而不是更新

mongoose overriding original object instead of updating

我有这样的东西:

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

当我更新这个对象时,说出 Ver01 密钥,我得到这样的结果:

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

它覆盖了整个数据结构,现在我无法访问我的其他 VerX

这是我的更新代码

 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}`]);
    }
  );
});

我试过只用 upsert:true,只用 new:true 和 niether 选项。它仍然不会只更新一个键。

您可以使用点符号来访问和设置对象内部的字段

const updateUser = await User.findOneAndUpdate(
  { email: req.body.email },
  { $set: { "pinnedKpi.Ver01":  ["oooooo", "77777"] }},
  { upsert: true, new: true }
)

使用这个:

  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}`]);
    }
  );
});