首页 > 解决方案 > 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.13and Mongo 3.6.5,可能会出现什么问题?我可以将逻辑直接放入 router.delete 但我更喜欢在模式导出之前挂钩它。

标签: node.jsmongodbexpressmongoose

解决方案


正如猫鼬文档中所述,我应该更新文档,而不是集合。所以,而不是:

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')


推荐阅读