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

时间:2018-06-22 10:17:58

标签: mongodb object mongoose insert-update

我有这样的东西:

  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选项进行了尝试。它仍然不会仅更新一个密钥。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

使用此:

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