更新猫鼬中的对象数组

时间:2021-07-30 08:04:48

标签: mongodb mongoose

我无法处理更新数据库中的对象数组,尝试了很多选项但没有任何效果。我很确定答案是显而易见的,但从星期三开始我就无法解决。 这是我的 kitSchema:

const kitSchema = new mongoose.Schema({
  email: {
    type: String,
    required: true,
  },
  password: {
    type: String,
    required: true,
  },
  kit: {
    type: Array,
    required: true,
  },
  profiles: {
    type: Array,
    required: true,
  },
});

module.exports = mongoose.model("Kit", kitSchema);

所有用户都有自己的文档,里面也有配置文件。我想通过传递用户的 id 和配置文件的 id 来更新单个配置文件。 数据示例:

_id: 1,
email: "abc@mail",
password: "abc",
profiles: [
           {
            id: 1,
            name: John
           },
          ]

这是我最新的无效解决方案:

router.put("/profile/:id", async (req, res) => {
  let kit = await Kit.findById(req.params.id, (error, data) => {
    if (error) {
      console.log(error);
    } else {
      console.log(data);
    }
  });
  try {
    await kit.profiles.findOneAndUpdate(
      { id: req.body.id },
      { name: req.body.name },
      { new: true },
      (error, data) => {
        if (error) {
          console.log(error);
        } else {
          console.log(data);
        }
      }
    );
    try {
      res.status(202).json({ message: "Changed" });
    } catch (err) {
      res.status(400).json({ message: err });
    }
  } catch (err) {
    res.status(400).json({ message: err });
  }
});

你能帮我处理一下吗?

1 个答案:

答案 0 :(得分:0)

和往常一样,经过几天的尝试,我在提问 10 分钟后得到了答案。这是我想出的:

router.put("/profile/:id", async (req, res) => {
  await Kit.findOneAndUpdate(
    { _id: req.params.id, profiles: { $elemMatch: { id: req.body.id } } },
    {
      $set: {
        "profiles.$.name": req.body.name,
        "profiles.$.profilePicture": req.body.profilePicture,
      },
    },
    { new: true, safe: true, upsert: true },
    (error, data) => {
      if (error) {
        console.log(error);
      } else {
        console.log(data);
      }
    }
  );
  try {
    res.status(202).json({ message: "Changed" });
  } catch (err) {
    res.status(400).json({ message: err });
  }
});