首页 > 解决方案 > 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:{
        
       }
   }) 
}

谢谢

标签: mongodbmongoosemongodb-querymongoose-schema

解决方案


对于 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每一次实际上都会夸大分数。我认为您想要做的是randompower_startifpower_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)]}
            }
        }
    ]
)

推荐阅读