node.js - 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"
我将不胜感激任何可以帮助我解决此问题的帮助或代码片段。谢谢 :)
解决方案
您尝试执行的操作(如错误状态)对于当前架构是不可能的,因为您的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 });
}
});
推荐阅读
- unity3d - 如何通过统一arcore录制视频?
- javascript - 角度 SVG 路径不可见
- postgresql - DBeaver 只能看到连接中的默认 PostgreSQL 数据库
- mysql - SQL 查询生成器 - 分组和排序 (Laravel)
- eclipse - 在 Maven 目标和 Maven 存储库中找到 Liquibase 资源
- google-bigquery - 为什么 BigQuery 有自己的存储空间?
- c# - Hangfire 事务处理(工作单元)
- css - Rails 5:带有选择类的 form_for 选择字段标签
- facebook - 为什么 facebook 不允许我创建更多应用程序?
- c# - 禁用/启用 ProcessCmdKey