所以我有一个问题。我有一个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文档的外观
我得到的错误
: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
答案 0 :(得分:2)
首先,您不应该在一个对象中使用2个对象ID。 MongoDB的优点是自动生成的ObjectID。对于您的问题(使用技能 ObjectID)
const user = await User.findByIdAndUpdate({ _id: userId }, {
$pull: { "skills":{skill:skillId } }
}, {
new: true
});
我相信您正在从您的参数中收到 ObjectID 。如果是这样,这样的事情应该会有所帮助。