Увеличение или уменьшение 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 и Mongo 3.6.5, что может пойти не так? Я мог бы поместить логику прямо в router.delete, но я предпочитаю подключать ее перед экспортом схемы.

Не могли бы вы попробовать вместо этого const увеличитьOrDecrease = saveOrDelete! == 'save'? -1: 1; иногда это срабатывает для меня.

vitomadio 10.09.2018 11:29

спасибо за комментарий, это тоже не сработает. Кажется, что updateUserAdsNumber('deleteOne') игнорируется при удалении объявления, и я не могу понять, почему. Я также пробовал с remove (я тоже изменил маршрут на Ad.remove(), но безуспешно.

Stathis Ntonas 10.09.2018 11:33
0
2
348
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как указано в документации мангуста, я должен обновлять документ, а не коллекцию. Итак, вместо:

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') в первом методе выше (в вопросе), и все работает, как ожидалось.

Другие вопросы по теме