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_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)]
]
)
【讨论】:
以上是关于MongoDB updateOne查询计算的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB中updateOne超过findOneAndUpdate的用例[重复]
在 MongoDB 中使用 updateOne 时如何访问 upsertedId