node.js - Mongoose 使用 schema.post 递增或递减不递减
问题描述
我正在尝试增加或减少用户的广告数量。我可以增加数字,但不能减少它。
const updateUserAdsNumber = (saveOrDelete) => {
finalSchema.post(saveOrDelete, (ad, next) => {
const increaseOrDecrease = saveOrDelete === 'save' ? 1 : -1;
User.findOneAndUpdate(
{_id: ad.adInfo.userId},
{$inc: {adsPublished: increaseOrDecrease}},
(err, user) => {
if (err) return console.error('User ads could not increase or decrease', err.message);
}
);
next();
});
};
updateUserAdsNumber('save');
updateUserAdsNumber('deleteOne');
finalSchema.plugin(mongooseUniqueValidator);
const AdModel = mongoose.model('Ad', finalSchema);
这是删除广告的路线:
router.delete('/:id', verifyTokenMiddleware, (req, res) => {
const id = req.params.id;
const {tokenDecoded} = req;
Ad.deleteOne({'adInfo.userId': tokenDecoded.userId, _id: mongoose.Types.ObjectId(id)}, (err) => {
if(err){
res.status(400).send({
message: 'The ad could not be deleted. (Error_message = ' + err.message + ')'
});
} else {
res.send({
message: 'Ad deleted successfully!'
})
}
})
});
我正在使用mongoose@5.2.13
and Mongo 3.6.5
,可能会出现什么问题?我可以将逻辑直接放入 router.delete 但我更喜欢在模式导出之前挂钩它。
解决方案
正如猫鼬文档中所述,我应该更新文档,而不是集合。所以,而不是:
router.delete('/:id', verifyTokenMiddleware, (req, res) => {
const id = req.params.id;
const {tokenDecoded} = req;
Ad.deleteOne({'adInfo.userId': tokenDecoded.userId, _id:
mongoose.Types.ObjectId(id)}, (err) => {
if(err){
res.status(400).send({
message: 'The ad could not be deleted. (Error_message = ' + err.message + ')'
});
} else {
res.send({
message: 'Ad deleted successfully!'
})
}
})
});
我用这个:
router.delete('/:id', verifyTokenMiddleware, (req, res) => {
const id = req.params.id;
const {tokenDecoded} = req;
Ad.findById({'adInfo.userId': tokenDecoded.userId, _id:
mongoose.Types.ObjectId(id)}, (err, ad) => {
if (err) {
res.status(500).send({
message: 'The ad could not be deleted. (Error_message = ' +
err.message + ')'
});
} else {
ad.remove(err => { <---- here's the document remove
if (err) {
console.log(err);
}
});
res.send({
message: 'Ad deleted successfully!'
});
}
});
});
并从上面的第一种方法(在问题中)切换到,一切都按预期工作updateUserAdsNumber('deleteOne')
。 updateUserAdsNumber('remove')
推荐阅读
- python - SQLite3 和 Python:为什么我的表格不打印?
- postgresql - 如何从连接表中获取列的最大值?
- python - 当没有下载链接但有一个javascript按钮时如何使用Python从网站下载文件
- algorithm - 根据维基百科,为什么冒泡排序的总空间复杂度为 O(1)?
- python - 如何将 x 和 y 像素的颜色更改为蓝色?
- mysql - 如何将数据集中的所有空值更新为 0
- python - 生成模拟外汇或股票 OHLC 数据以用于熊猫问题的可重现示例
- php - Discogs API PHP,封面图片。卷曲?
- python - 如何告诉 CVXPY x^T * x 是 SDP?
- javascript - 在opencart商店的php中将href添加到背景图像