MongoDB updateOne查询计算

Posted

技术标签:

【中文标题】MongoDB updateOne查询计算【英文标题】:Mongo DB updateOne query calculation 【发布时间】:2021-01-03 03:23:59 【问题描述】:

我有这个架构:

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

谢谢

【问题讨论】:

您需要使用Updates with Aggregation。 一个例子将不胜感激 【参考方案1】:

对于 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 求和实际上会夸大分数。我认为你想要做的是将randompower_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)]
            
        
    ]
)

【讨论】:

以上是关于MongoDB updateOne查询计算的主要内容,如果未能解决你的问题,请参考以下文章

《MongoDB入门教程》第14篇 CRUD之更新文档

《MongoDB入门教程》第14篇 CRUD之更新文档

MongoDB中updateOne超过findOneAndUpdate的用例[重复]

在 MongoDB 中使用 updateOne 时如何访问 upsertedId

mongodb:如果元素不存在,则updateOne设置字符串数组,如果存在则保持不变

带有嵌入式文档的MongoDB findOne()和updateOne()