我有这个架构:
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”的总和
“电源启动”将随机数作为默认值。
我刚开始写书并陷入困境:
updateHeroPower: async({id})=>{
const res = await HeroSchema.updateOne({
_id: id
},{
$set:{
}
})
}
谢谢
答案 0 :(得分:0)
对于Mongo 4.2+版本,您可以像这样使用pipelined updates:
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
与power_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)]}
}
}
]
)