Mongo DB updateOne查询计算

时间:2020-09-16 10:00:12

标签: mongodb mongoose mongodb-query mongoose-schema

我有这个架构:

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:{
        
       }
   }) 
}

谢谢

1 个答案:

答案 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_currentpower_start相加实际上会提高得分。我认为您想做的是,如果random不存在,则将power_startpower_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)]}
            }
        }
    ]
)