MongoDB:从用户文档中删除技能

时间:2019-03-25 15:17:45

标签: javascript node.js mongodb

所以我有一个问题。我有一个MongoDB user文档,并且该文档具有属性技能,该属性是一个填充有对象的数组。

我现在要做的是以下内容。客户端发送删除这些技能之一的请求。因此,我发送了技能ID,然后要从用户中删除该技能。我该怎么办?

我当前拥有的是:skills属性数组中的每个项目都有一个skill属性,即objectID。当此objectID与客户端发送的objectId匹配时,我们想从用户中删除此技能

const removeSkill = async (req, res) => {
  try {
    const { userId, params: { skillId } } = req;

    const user = await User.findByIdAndUpdate({ _id: userId }, {
      $pull: { "skills.skill": skillId }
    }, {
      new: true
    });

    return res.status(200).json({
      message: 'succesfully removed skill',
      user
    });
  } catch (err) {
    return sendErr(res, err);
  }
};

用户mongodb文档的外观

enter image description here

我得到的错误

:no_entry: Error:
MongoError: Cannot use the part (skill) of (skills.skill) to traverse the element ({skills: [ { _id: ObjectId('5c8729be12e1cc05c04ea182'), name: "javascript", skill: ObjectId('5c8729be
12e1cc05c04ea181'), points: 22 }, { _id: ObjectId('5c8729dc12e1cc05c04ea184'), name: "node.js", skill: ObjectId('5c8729dc12e1cc05c04ea183'), points: 14 }, { _id: ObjectId('5c872a6c12e1c
c05c04ea186'), name: "css", skill: ObjectId('5c872a6c12e

1 个答案:

答案 0 :(得分:2)

首先,您不应该在一个对象中使用2个对象ID。 MongoDB的优点是自动生成的ObjectID。对于您的问题(使用技能 ObjectID)

 const user = await User.findByIdAndUpdate({ _id: userId }, {
  $pull: { "skills":{skill:skillId } }
}, {
  new: true
});

我相信您正在从您的参数中收到 ObjectID 。如果是这样,这样的事情应该会有所帮助。