You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mongoose更新MongoDB中Populate的Wallet字段不生效,求原因与解决

问题原因及解决方案

你的操作确实有误,核心问题是:populate只是把关联的Wallet文档加载到内存中的User对象里,但User集合本身只存Wallet的ID引用。你修改的是内存里的Wallet对象,但调用await contestant.save()只会更新User集合的内容,不会自动同步到Wallet集合,所以MongoDB里的Wallet数据没变化。

正确的几种处理方式:

方式1:直接找到Wallet文档修改并保存

// 从内存中的Wallet对象拿到ID,去更新Wallet集合
const wallet = await Wallet.findById(contestant.Wallet._id);
wallet.cash -= Matchcontest.joiningfee;
await wallet.save();

方式2:用findByIdAndUpdate直接更新(更高效)

// 直接通过ID更新,不用先查询文档
await Wallet.findByIdAndUpdate(
  contestant.Wallet._id,
  { $inc: { cash: -Matchcontest.joiningfee } }, // $inc用于增减数值,比直接赋值更安全
  { new: true } // 可选,返回更新后的Wallet文档
);

方式3:保存populate出来的Wallet对象(而不是User)

如果你想沿用之前的代码逻辑,只需要把保存对象换成Wallet:

contestant.Wallet.cash -= Matchcontest.joiningfee;
await contestant.Wallet.save(); // 这里保存的是Wallet文档,不是User

内容的提问来源于stack exchange,提问作者RAHUL BISHT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:13:16