Увеличение или уменьшение Mongoose с использованием schema.post не уменьшается - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь увеличить или уменьшить количество объявлений пользователя. Я могу увеличить число, но не могу уменьшить его.

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, но я предпочитаю подключать ее перед экспортом схемы.

1 Ответ

0 голосов
/ 21 сентября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...