mongodb - Mongo DB updateOne 查询计算
问题描述
我有这个架构:
const HeroSchema = new mongoose.Schema({
name: {
type: String,
required: true
},
power_start: {
type: Number,
required: true,
default: Math.floor(Math.random() * 10)
},
power_current: {
type: Number,
required: true,
default: 0
}
})
当用户单击按钮时,我想将 1-10 之间的“power”随机添加到“power_current”。意思是,我需要“power_current”中的最终数字是“power_start”+随机数+“power_current”的总和
'power start' 默认获取随机数。
我刚开始写并卡住了:
updateHeroPower: async({id})=>{
const res = await HeroSchema.updateOne({
_id: id
},{
$set:{
}
})
}
谢谢
解决方案
对于 Mongo 4.2+ 版,您可以使用管道更新,如下所示:
const res = await HeroSchema.updateOne({
_id: id
},
[
{
$set: {
power_current: {$sum: ["$power_current", "$power_start", Math.floor(Math.random() * 10)]}
}
}
]
)
较旧的 Mongo 版本无权访问更新对象中的文档字段。这意味着您必须将其拆分为 2 个调用。首先阅读文档,然后使用您获取的信息对其进行更新。
需要注意的一件事是,我不确定您是否真的想要您要求的逻辑求和power_current
,并且power_start
每一次实际上都会夸大分数。我认为您想要做的是random
与power_start
ifpower_current
不存在求和,否则将其与它相加,因为它在初始总和之后power_current
已经体现了价值。power_start
假设我的假设是正确的,您可以使用$ifNull来实现
const res = await HeroSchema.updateOne({
_id: id
},
[
{
$set: {
power_current: {$sum: [{$ifNull: ["$power_current", "$power_start"]}, Math.floor(Math.random() * 10)]}
}
}
]
)
推荐阅读
- database - 使用多个数据库全新构建应用程序
- elasticsearch - elasticsearch-rest-high-level-client:6.5.0 BulkRequest 不再工作
- php - 使用 Ajax 传递 PHP var
- sql - vb.net 和 sql 数据库应用程序安装程序
- c# - .NET 获取 AD 计算机的完整属性列表(以匹配 Powershell Get-ADComputer API)
- css - 未能将边框半径样式应用于表格
- angular - NgxPermissions hasPermission 检查在 Angular 6 中的 Observable 方法中
- java - 读取数据时套接字损坏或超时
- typescript - 由 Typescript 中的泛型函数生成器生成时无法分配的函数返回类型
- angular - Ionic 4 - Angular 6:如何控制 Ionic 路由器历史记录以停止缓存视图组件?