首页 > 解决方案 > Mongoose $inc updateMany 不能使用非数字参数递增

问题描述

Node API,我们有 Mongo 的配置文件集合,每个配置文件都有 subscription_plan,代表他们为使用应用程序支付的剩余天数。现在,我在后端工作的一部分应该将所有配置文件的 subscription_plan 减少 1。问题是,subscription_plan 被声明为字符串,所以我不能只将它减少 1 我在这里得到一些提示后尝试了这个:

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" 

我将不胜感激任何可以帮助我解决此问题的帮助或代码片段。谢谢 :)

标签: node.jsmongodbmongoose

解决方案


您尝试执行的操作(如错误状态)对于当前架构是不可能的,因为您的Profile模型架构定义subscription_plan为 aString并且$inc仅适用于数字字段。

更改该字段的架构类型或使用聚合管道通过创建具有一组聚合管道操作的管道来更新值,即 1) 获取当前值,2) 使用 将其转换为数值$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 });
    }
});

推荐阅读