我正在尝试从我创建的猫鼬模式之一的数组中删除一个元素。但是pull方法对我来说似乎不太好
我设法添加一个元素,并且我试图使其基本相同,但相反。但是pull方法似乎不适用于我。
这是我的模式
export PATH=$PATH:/usr/local/go/bin
这就是我向数组添加元素的方式
userName: {type: String, required: true, unique: true},
password: {type: String, required: true},
favorite: [{type: Schema.Types.ObjectId, ref:'programs'}]
在这里,我尝试以类似的方式删除一个元素,但是没有用,在邮递员中它表明它不能放置
router.put('/favorite/:id', (req, res) => {
User.findOne({ _id: req.params.id }, (err, user) => {
if(err) return console.error(err);
user.favorite.push(req.body.favorite);
user.save((err, user) => {
if(err) return console.error(err);
console.log(user);
});
res.json(user);
})
});
基本上,我只需要能够按其ID删除该元素。我觉得应该在某处提到id,但是我不确定在哪里或如何使用。感谢所有提示
答案 0 :(得分:2)
我强烈建议使用由callbacks
插入的async await
,mongoose
支持Promises
。
您还可以使用mongoose queries
而不是JavaScript
来更新字段,这将减少对数据库的查询量。
此外,当发生错误时,请不要忘记向用户发送响应以告知发生了问题。
您尝试在MongoDB $pull
中使用JavaScript
运算符,而不是在查询中使用它,但是您不能在MongoDB operators
中使用JavaScript
您还可以通过req.params
的{{3}}属性来使其更具可读性
请注意,该ID必须是用户文档ID,收藏夹必须是收藏夹文档ID
现在您可以使用destructure
// to use the await keyword we have to set the callback to an async function
router.put('/favorite/:id', async (req, res) => {
// destruct id from the req.params object and favorite from req.body
const { id } = req.params;
const { favorite } = req.body;
try {
const updatedUser = await User.findByIdAndUpdate(id,
{ $push: { favorites: favorite } },
// new: true means return the updated document
{ new: true },
);
res.send(updatedUser);
} catch (e) {
console.error(e);
res.status(500).send('Something went wrong');
}
});
并使用$push
router.put('/favorite/delete/:id', async (req, res) => {
const { id } = req.params;
const { favorite } = req.body;
try {
const updatedUser = await User.findByIdAndUpdate(id,
{ $pull: { favorites: favorite } },
{ new: true },
);
res.send(updatedUser);
} catch (e) {
console.error(e);
res.status(500).send('Something went wrong');
}
});