Понедельник goose $ в c updateMany не может увеличиваться с аргументом без нумерации c - PullRequest
1 голос
/ 23 января 2020

Node API, где у нас есть коллекция профилей Mon go, и у каждого профиля есть subscription_plan, который представляет оставшиеся дни, которые они заплатили за использование приложения. Теперь я работаю над частью серверной части, которая должна уменьшить subscription_plan всех профилей на 1. Проблема заключается в том, что subscription_plan объявлен как String, поэтому я не могу просто уменьшить его на 1. Я попытался с этим, получив несколько советов: 1001 *

router.put('/reduceSubscription', async (req, res) => {
    try {
        const updatedProfiles = await Profile.updateMany({ is_active: true }, [
            {
                $set: {
                    subscription_plan: {
                        $toString: {
                            $subtract: [{ $toInt: '$subscription_plan' }, 1]
                        }
                    }
                }
            }
        ]).exec();
        console.log(updatedProfiles);
    } catch (err) {
        res.status(500).send({ msg: err.message });
    }
});

После тестирования в почтальоне я получил сообщение:

"msg": "Failed to parse number 'NaN' in $convert with no onError value: Bad digit \"N\" while parsing NaN" 

Буду признателен за любую помощь или фрагмент кода, который поможет мне решить эту проблему. Спасибо:)

1 Ответ

0 голосов
/ 23 января 2020

То, что вы пытаетесь сделать (из-за ошибок), невозможно с текущей схемой просто потому, что ваша Profile схема модели определяет subscription_plan как String, а $inc работает только с цифрами c поля.

Либо измените тип схемы для этого поля, либо используйте агрегатный конвейер , чтобы обновить значение путем создания конвейера, который имеет набор операций конвейера агрегации, т.е. 1) получить текущее значение, 2 ) преобразовать его в числовое значение c, используя $toInt, 3) уменьшить значение с помощью $subtract и 4) установить новое значение обратно в строку, используя $toString:

router.put('/reduceSubscription', async (req, res) => {
    try {
        await Profile.updateMany(
            { is_active: true },
            [
                { '$set': {
                    'subscription_plan': {
                        '$toString': {
                            '$subtract': [
                                { '$toInt': '$subscription_plan' },
                                1
                            ]
                        }
                    }
                } }
            ]
        ).exec();
        res.json('Profiles updated');
    } catch (err) {
        res.status(500).send({ msg: err.message });
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...